我正在使用Django表单向导将数据输入到表单页面,然后将其显示在确认页面中。但是,当我尝试调用self.get_cleaned_data_for_step(step_name)时,我得到一个"' MyForm'对象没有属性' cleaning_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(&#39; meal_form&#)访问views.py中myalFormWizard类的get_context_data方法中上一步的清理数据。 39)。但事实并非如此,但我不确定我哪里出错了。
答案 0 :(得分:1)
覆盖is_valid
这样的工作 - 如果您按照代码操作,您会看到表单cleaned_data
属性由普通is_valid
设置方法。
文档日如果表单无效,那么get_cleaned_data_for_step
将返回None
,您需要编写代码以便它可以处理此问题。
答案 1 :(得分:0)
如果这对任何人都有帮助。我的问题是,在我的createMeal.html中,我的按钮只是将向导转到下一步,绕过任何验证。正确的解决方案是创建一个简单的提交按钮来提交表单,然后向导将验证表单,如果它有效,它将继续进行下一步。