我在理解django表单向导时遇到了一些问题。
主要是,我不明白如何处理form_list。
到目前为止,这是我的视图:
class AddLocation(SessionWizardView):
template_name = "dash/AddLocation.html"
def processAddLocation(self, form_list, **kwargs):
def done(self, form_list, **kwargs):
processAddLocation(form_list)
return redirect(reverse('location_manager'))
这是我的表单:
class regionForm(forms.Form):
name = forms.CharField(max_length=255)
class locationForm(forms.Form):
location_name = forms.CharField()
street_address = forms.CharField()
city = forms.CharField()
zip_code = forms.CharField()
(是的,每个表单是向导的一页)
以下是模型此表单向导最终应保存为:
class Location(models.Model):
region = models.ForeignKey(Region, blank=True, null=True)
manager = models.ForeignKey(User, blank=True, null=True)
name = models.CharField(max_length=255)
street_address = models.TextField(blank=True) # allowing this blank for the min.
city = models.CharField(max_length=255, blank=True)
zip_code = models.CharField(max_length=20, blank=True)
任何指向正确方向的人都会非常感激。
答案 0 :(得分:1)
表单列表只是用户已完成的有效表单的列表。从一个表单创建location
与从多个表单创建它是一样的。您只需确保从正确的cleaned_data
字典中获取数据。
您的done
方法看起来像这样:
def done(self, form_list, **kwargs):
region_form, location_form = form_list
location = Location(
street_address=location_form.cleaned_data['street_address']
# populate other fields here
...
)
location.save()
return redirect(reverse('location_manager'))
您需要done
方法,因为表单向导需要它。您不需要processAddLocation
方法,因此我没有将其包含在我的答案中。如果您觉得它使代码更容易理解,您可以定义此方法并将位置创建代码移入其中。
在外键的情况下,例如region
,您必须将cleaned_data['region']
转换为region
对象。您可能必须向表单添加验证,以确保您的用户输入有效区域。对于这些外键字段,ModelChoiceField
可能更好。