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

Python Django formwizard-无法从步骤1到步骤2获取数据,python,django,templates,django-forms,django-formwizard,Python,Django,Templates,Django Forms,Django Formwizard,我正在使用Django表单向导将数据输入表单页面,然后在确认页面中显示数据。但是,当我尝试为步骤(步骤名称)调用self.get_cleaned_data_时,我得到了一个“'MyForm'对象没有'cleaned_data'属性”。我知道如果表单验证失败,可能会发生这种情况,因此我重写了表单类中的is_valid方法以始终返回True,就像测试一样,但我仍然会遇到此错误。我的相关代码如下: forms.py ... class MealForm(forms.Form): modifi

我正在使用Django表单向导将数据输入表单页面,然后在确认页面中显示数据。但是,当我尝试为步骤(步骤名称)调用self.get_cleaned_data_时,我得到了一个“'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
...
url(r'^(?P<url>[-\w]+)/meal/$',
    login_required(views.MealFormWizard.as_view(views.MealFormWizard.FORMS)), name="meal"),
...
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**
url.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
...
url(r'^(?P<url>[-\w]+)/meal/$',
    login_required(views.MealFormWizard.as_view(views.MealFormWizard.FORMS)), name="meal"),
...
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**
createDine.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>
。。。
{%csrf_令牌%}
{{wizard.management_form}
{{wizard.form}
送餐

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

覆盖
是否有效这样做是行不通的-如果您遵循代码,您将看到表单的
清理的数据
属性是由正常的
是否有效
方法设置的


如果表单无效,则步骤
get\u cleanned\u data\u将返回
None
,您需要编写代码,以便它能够处理此问题

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

我认为像这样重写该方法会很好,因为在django表单源代码中的is_valid()的实现中,该方法中唯一的一点是“return self.is_bound and not self.errors”,因此始终返回True似乎不会删除任何功能。我遗漏了什么吗?你需要进一步遵循代码。
self.errors
属性调用
self.full\u clean()
,设置
cleaned\u data
属性。