【问题标题】:Django form wizard handlingDjango 表单向导处理
【发布时间】:2014-08-23 22:26:15
【问题描述】:

我在理解 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 个表单保存到特定模型中

任何指向正确方向的指针都将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    表单列表只是用户已完成的有效表单的列表。从一个表单创建location 与从多个表单创建相同。您只需要确保从正确表单的cleaned_data dict 中获取数据。

    您的视图的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 可能更适合这些外键字段。

    【讨论】:

    • 感谢您的回答。几个额外的问题:如果 form_list 超过 2 个列表(比如说 3 个或更多),为每个列表分配的最佳方法是什么?此外,form_list 是否出现在与表单完成顺序相同的列表中?就像 form1 在列表中是 [0],form2 是 [1] 等等?
    • 是的,form_list 中的表单按照表单向导中指定的顺序排列。如果您有两个以上的表格,您可以继续使用form0, form1, form2 = form_list 解压缩它们,或者在多行上进行解压,例如form0 = form_list[0]form1 = form_list[1] 等等。
    猜你喜欢
    • 2015-07-04
    • 2018-01-07
    • 2012-05-19
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    相关资源
    最近更新 更多