为了账号安全,请及时绑定邮箱和手机立即绑定

Django 表单向导:为什么提交后不调用 done() 方法?

Django 表单向导:为什么提交后不调用 done() 方法?

白猪掌柜的 2021-06-04 14:20:22
我正在使用 aSessionWizardView并且我不明白为什么done()从不调用该方法。相反,在发布我的表单后,在最后一步,我可以POST HTTP 200在我的服务器上看到 a ,但这没有任何作用。该get_form()方法按预期工作。我怀疑是分散注意力的错误,因为我对另一个视图有完全相同的逻辑,这很有效。下面是整个代码。风景class DiscountsCreateView(PermissionRequiredCanHandleProducts,                      ModelInContextMixin,                      RestaurantMixin, SubSectionDiscounts,                      SessionWizardView):    """ Wizard view to create a discount in 2 steps """    model = Discount  # used for model context    form_list = [DiscountForm0, DiscountForm1]    template_name = "discounts/discount_add.html"    def get_form(self, step=None, data=None, files=None):        form = super().get_form(step, data, files)        if step is None:            step = self.steps.current        # step0 - name, kind, tax_rate        # => nothing special to do, always the same form        # step1 - specific fields related to the chosen kind        if step == '1':            step0_data = self.storage.get_step_data('0')            kind = step0_data['0-kind']            # combo => combo, combo_unit_price            if kind == Discount.COMBO:                form.fields['combo'].queryset = Combo.objects.restaurant(self.restaurant)                # NOTE : this is not a scalable way to show/hide fields (exponential)                form.fields['rebate_amount'].widget = forms.HiddenInput()            elif kind == Discount.REBATE:                form.fields['combo'].widget = forms.HiddenInput()                form.fields['combo_unit_price'].widget = forms.HiddenInput()        return form    def done(self, form_list, **kwargs):        data = [form.cleaned_data for form in form_list]        try:            Discount.objects.create(                name=data[0]['name'],                kind=data[0]['kind'],                tax_rate=data[0]['tax_rate'],                rebate_amount=data[1]['rebate_amount'],                combo=data[1]['combo'],                combo_unit_price=data[1]['combo_unit_price']            )
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

done()如果form在最后一步提交,则始终调用该方法is_valid()。因此,如果不是,则必须意味着您form的无效。

在您的情况下,您隐藏了DiscountForm1. 因此,您还隐藏了这些字段的错误。clean()如果填写了适当的字段,您应该将它们设为可选并检查表单的方法。


查看完整回答
反对 回复 2021-06-06
  • 1 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信