Django表单向导处理

时间:2014-07-02 23:45:11

标签: python django forms django-forms django-formwizard

我在理解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)
  1. 现在我该如何处理form_list?
  2. form_list究竟返回了什么?
  3. 为什么我需要proccessAddLocation方法和done方法(这是向我建议的,但我似乎无法理解为什么)。
  4. 如何将2个表单保存到特定模型
  5. 任何指向正确方向的人都会非常感激。

1 个答案:

答案 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可能更好。