【问题标题】:How to access form data in `FormView.get_success_url()`如何在 `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 或从头开始重建表单)?

【问题讨论】:

    标签: python django django-forms django-views django-class-based-views


    【解决方案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 方法,我可以在我的问题中这样做。我试图避免这种情况。
    猜你喜欢
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多