如何在`FormView.get_success_url()`中访问表单数据

Luc*_*iel 9 python django django-forms django-views django-class-based-views

目前,我有一个看起来像这样的表格:

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)
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢做更惯用的事情,并使用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)
Run Code Online (Sandbox Code Playgroud)

然而,该形式不传递到get_success_url,并且不同于请求上下文的许多其他件(如self.requestself.kwargs,或self.object(在DetailView)),的形式不附着如在标准的任何点的属性FormView调度序列。有没有什么好方法可以访问经过清理和验证的表单数据get_success_url(即,无需self.request.POST从头开始访问或重建表单)?

nev*_*ner 6

您可以覆盖form_valid方法将表单编写为实例属性并self.form在内部使用get_success_url

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)
Run Code Online (Sandbox Code Playgroud)

  • 这是我的想法之一——重写“get_form”来做同样的事情是另一个想法——但这似乎很遗憾,因为重点是不必向“form_valid”添加任何额外的代码,因为默认行为有效很好,*除了*无法从“get_success_url”访问表单 (3认同)