【问题标题】:What is the cleanest way for validation on dynamic forms in Django?在 Django 中验证动态表单的最简洁方法是什么?
【发布时间】:2020-08-19 05:59:08
【问题描述】:

我从事在线服装、鞋子、配饰商店的项目已有一段时间了。我有一个包含类别、子类别、尺寸字段等的表单。如果所选类别是“衣服”或“鞋子”,则需要尺寸字段。但是,如果类别选择是“附件”,则尺寸字段将被隐藏并且不是必需的,因为在我的情况下,附件没有尺寸。我的类别选择也不是硬编码的,它们存储在数据库中。因此,当我进行验证时,在表单的 clean 方法中,我硬编码了一个 if 语句,当用户的类别选择不同于“附件”并且尺寸字段为空白时,该语句会触发错误。但我认为这不是很干净,因为 if 语句有点硬编码。我的问题是:有没有更清洁的解决方案来完成这项任务?

class ItemCreateForm(forms.ModelForm):

    class Meta:
        model = Item
        fields = ['category', 'subcategory', 'brand', 'brand_collection', 'price', 'price_negotiable',
                  'size', 'gender', 'condition', 'description']

    def clean(self):
        cleaned_data = super().clean()
        category = cleaned_data.get("category")
        size = cleaned_data.get("size")

        if str(category) != 'accessories' and not size:
            print(category)
            print(size)
            self.add_error('size', 'Това поле е задължително!')

        return cleaned_data

【问题讨论】:

    标签: python django forms web django-forms


    【解决方案1】:

    如果该数据在数据库中,您可能还需要在数据库中保留条件逻辑。您可以提出自己的特定领域语言,并在您的 Category 模型中的文本字段中添加一个“程序” - 人为的示例,可能会遗漏一些东西:

    ifempty size error "Това поле е задължително!"
    iflt size 0 error "Size must be >= 0"
    ifgt size 50 error "Size must be <= 50"
    

    为类似的事情编写一个解释器会相当简单......或者如果你感觉更冒险,也许是基于 S 表达式的东西?不过,我建议不要在此处直接保存 Python,因为它很难沙箱化。

    【讨论】:

      猜你喜欢
      • 2017-05-21
      • 2012-05-26
      • 1970-01-01
      • 2012-09-30
      • 1970-01-01
      • 2011-01-09
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多