如何在 `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.requestself.kwargsself.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 中开始新的活动?

在 Avkit 中如何使用这三行代码,以及如何将音乐静音”

如何在 JDBC 中启动事务?

如何在 Fragment 中调用 OnActivityResult 以及它是如何工作的?

如何使用 Firebase 在 Web 上托管 Flutter?它的效果如何?