具有依赖关系的动态表单的Django方式?

时间:2016-07-17 17:28:14

标签: django forms if-statement dependencies required

我正在寻找一种django方法来处理一些具有大量业务逻辑的复杂表单。问题是我的很多表格都有依赖关系 一些例子:
1.两个相互依赖的“选择”(选择)字段。例如,考虑两个下拉菜单,一个用于国家,一个用于城市 2.“required-if”规则,即如果选择了表单中的其他内容,则需要设置字段。假设用户在选择字段中选择“其他”选项,他需要在textarea中添加解释 3.处理日期/日期时间字段的一些方法,即最大/最小日期等规则?

我现在正在做的是以clean()__init__()的形式实现所有这些,并编写一些(繁琐的)客户端JS。

我想知道是否有更好的方法?比如在类似于django Meta类的东西中定义这些规则。

2 个答案:

答案 0 :(得分:0)

1.这项任务与形式的html建筑有关,不涉及django / jinga。 在这里,你去动态表格。现在最好和最常用的方法是通过JS。 3.建立一个带有"时间"输入字段然后通过" admin"看他们如何处理它。这里介绍了所有特殊字段的用法:https://docs.djangoproject.com/en/1.9/ref/forms/fields/

答案 1 :(得分:0)

我要取消这个线程的讨论,因为我还没有一个好的答案。如果您尝试验证一个字段,并且希望该字段的验证依赖于相同格式的另一个字段,请使用clean(self)方法。

这里是一个示例:假设您有两个字段,分别是“ main_image”和“ image_2”。您要确保如果用户上传第二张图片,那么他们也要上传主图片。如果他们没有上传图片,则默认图片将称为“ default_ad.jpg”。

在forms.py中:

class AdForm(forms.ModelForm):

  class Meta:
    model = Ad

    fields = [
        'title',
        'main_image',
        'image_2',
        'item_or_model_names',
        'category',
        'buying_or_selling',
        'condition',
        'asking_price',
        'location',
    ]

  def clean(self):
  # "Call the cleaned form"
        cleaned_data = super().clean()
        main_image = cleaned_data.get("main_image")
        image_2 = cleaned_data.get("image_2")

        if "default_ad" not in image_2:
            # Check to see if image_2's name contains "default_ad"
            if "default_ad" in main_image:
                raise forms.ValidationError(
                    "Oops, you didn't upload a main image."
                )

如果您想了解更多信息,请阅读:https://docs.djangoproject.com/en/2.2/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

祝你好运!