Django formwizard - 无法从步骤 1 到步骤 2 获取数据

Posted

技术标签:

【中文标题】Django formwizard - 无法从步骤 1 到步骤 2 获取数据【英文标题】:Django formwizard - cannot get data from step 1 to step 2 【发布时间】:2015-09-03 09:07:18 【问题描述】:

我正在使用 Django 表单向导将数据输入表单页面,然后将其显示在确认页面中。但是,当我尝试调用 self.get_cleaned_data_for_step(step_name) 时,我得到一个“'MyForm' 对象没有属性 'cleaned_data'”。我知道如果表单验证失败会发生这种情况,所以我覆盖了表单类中的 is_valid 方法以始终返回 True,就像测试一样,但我仍然收到此错误。我的相关代码如下:

forms.py

...
class MealForm(forms.Form):

    modifications = forms.CharField()

    def __init__(self, *args, **kwargs):
        menu_items = kwargs.pop('menu_items')
        super(MealForm, self).__init__(*args, **kwargs)

        for item in menu_items:
            self.fields[str(item.name)] = forms.IntegerField(widget=forms.NumberInput(attrs='value': 0))

    def is_valid(self):
        return True

urls.py

...
url(r'^(?P<url>[-\w]+)/meal/$',
    login_required(views.MealFormWizard.as_view(views.MealFormWizard.FORMS)), name="meal"),

views.py

...
class MealFormWizard(SessionWizardView):

    FORMS = [('meal_form', MealForm),
             ('meal_form_confirmation', MealFormConfirmation)]

    TEMPLATES = 'meal_form': 'restaurant/createMeal.html',
                 'meal_form_confirmation':     'restaurant/confirmation.html'

    def get_form_kwargs(self, step=None):
        kwargs = 

        url = self.kwargs['url']
        restaurant = Restaurant.objects.get(url=url)
        menu_items = MenuItem.objects.filter(restaurant=restaurant)

        if step == 'meal_form':
            kwargs['menu_items'] = menu_items

        return kwargs

    def get_context_data(self, form, **kwargs):

        context = super(MealFormWizard, self).get_context_data(form=form, **kwargs)

        if self.steps.current == 'meal_form':
            context.update(...objects/vars...)

        if self.steps.current == 'meal_form_confirmation':
            cd = self.get_cleaned_data_for_step('meal_form') **This is where my error occurs**

createMeal.html

...
<form action="" method="post">
% csrf_token %
 wizard.management_form 

 wizard.form 

<button name="wizard_goto_step" type="submit" value=" wizard.steps.next ">Submit Meal</button>
</form>

在 createMeal.html 中提交表单后,我应该能够通过调用 self.get_cleaned_data_for_step('meal_form') 访问 views.py 中 MealFormWizard 类的 get_context_data 方法中上一步的清理数据。但是,事实并非如此,但我不确定我哪里出错了。

【问题讨论】:

【参考方案1】:

像这样覆盖 is_valid 是行不通的 - 如果您按照代码进行操作,您会看到表单的 cleaned_data 属性是由普通的 is_valid 方法设置的。

文档说如果表单无效,那么get_cleaned_data_for_step 将返回None,您需要编写代码以便它可以处理此问题。

【讨论】:

我认为重写这样的方法会很好,因为在 django 表单源代码中 is_valid() 的实现中,方法中唯一的内容是“返回 self.is_bound 而不是 self.errors ",所以一直返回 True 似乎并没有删除任何功能。我错过了什么吗? 您需要进一步遵循代码。 self.errors 属性调用self.full_clean(),它设置了cleaned_data 属性。【参考方案2】:

如果这对任何人都有帮助。我的问题是,在我的 createMeal.html 中,我的按钮只是将向导带到下一步,绕过任何验证。正确的解决方案是制作一个简单的提交按钮来提交表单,此时向导将验证表单,如果有效,它将继续下一步。

【讨论】:

以上是关于Django formwizard - 无法从步骤 1 到步骤 2 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

Django 的 FormWizard 中的空 ModelFormset

编辑时的 Django FormWizard 预填充

使用 formwizard-django 创建用户后登录

带有动态表单的 Django FormWizard

django manytomany 字段使用 through 和 formwizard

Django formwizard 与表单集和表单在同一页面上