首页 > 解决方案 > 在 Django 中验证动态表单的最简洁方法是什么?

问题描述

我一直在为在线服装、鞋子、配饰商店做一个项目。我有一个包含类别、子类别、尺寸字段等的表单。如果所选类别是“衣服”或“鞋子”,则需要尺寸字段。但是,如果类别选择是“附件”,则尺寸字段将被隐藏并且不是必需的,因为在我的情况下,附件没有尺寸。我的类别选择也不是硬编码的,它们存储在数据库中。因此,当我进行验证时,在表单的 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

标签: pythondjangoformswebdjango-forms

解决方案


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

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

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


推荐阅读