如何在 `FormView.get_success_url()` 中访问表单数据
Posted
技术标签:
【中文标题】如何在 `FormView.get_success_url()` 中访问表单数据【英文标题】:How to access form data in `FormView.get_success_url()` 【发布时间】:2018-07-13 17:39:24 【问题描述】:目前,我有一个如下所示的表单:
class SelectBoard(generic.FormView):
form_class = forms.SelectBoard
def form_valid(self, form):
board_name = form.cleaned_data['name']
return redirect('leaderboard', board_name=board_name)
但是,我更喜欢做更惯用的事情,并使用get_success_url
。像这样的:
class SelectBoard(generic.FormView):
form_class = forms.SelectBoard
def get_success_url(self):
form = ???
board_name = form.cleaned_data['name']
return reverse('leaderboard', board_name=board_name)
但是,该表单不会传递给get_success_url
,并且与许多其他请求上下文(如self.request
、self.kwargs
或self.object
(在DetailView
)中)不同,该表单不是附加的作为标准FormView
调度序列中任意点的属性。有什么好的方法可以访问get_success_url
中已清理和验证的表单数据(即无需访问self.request.POST
或从头开始重建表单)?
【问题讨论】:
【参考方案1】:您可以覆盖form_valid
方法以将表单写入实例属性并在get_success_url
中使用self.form
:
class SelectBoard(generic.FormView):
form_class = forms.SelectBoard
def form_valid(self, form):
"""If the form is valid, redirect to the supplied URL."""
self.form = form
return HttpResponseRedirect(self.get_success_url())
def get_success_url(self):
board_name = self.form.cleaned_data['name']
return reverse('leaderboard', board_name=board_name)
【讨论】:
这是我的一个想法——覆盖get_form
做同样的事情是另一件事——但这似乎很遗憾,因为重点是不必向 @ 添加任何额外的代码987654326@,因为默认行为很好除了无法从get_success_url
访问表单【参考方案2】:
如果需要,您可以在 form_valid 方法中设置 success_url 属性来获取表单字段值
class SelectBoard(generic.FormView):
form_class = forms.SelectBoard
def form_valid(self, form):
board_name = form.cleaned_data['name']
self.success_url = reverse('leaderboard', board_name=board_name)
return super().form_valid(form)
【讨论】:
当然,但是如果我正在编写form_valid
方法,我可以在我的问题中这样做。我试图避免这种情况。以上是关于如何在 `FormView.get_success_url()` 中访问表单数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在异步任务中调用意图?或者如何在 onPostExecute 中开始新的活动?