python - 在 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
解决方案
如果该数据在数据库中,您可能还需要将条件逻辑保留在数据库中。您可以提出自己的特定领域语言,并在您的 Category 模型中的文本字段中添加一个“程序” - 人为的示例,可能会遗漏一些东西:
ifempty size error "Това поле е задължително!"
iflt size 0 error "Size must be >= 0"
ifgt size 50 error "Size must be <= 50"
为这样的事情写一个解释器会相当简单......或者如果你感觉更冒险,也许是基于 S 表达式的东西?不过,我建议不要在那里直接保存 Python,因为它很难沙箱化。
推荐阅读
- swift - 为什么 NavigationLink() 在 SwiftUI 2 中保持打开状态
- java - 无法访问“androidx.savedstate.SavedStateRegistryOwner”
- javascript - 如何在每个弹出窗口中有不同的文本
- python - Django Rest:将查询集传递给超链接模型序列化程序
- cygwin - 从 mirrir 站点下载时,Cygwin 安装显示权限被拒绝?
- python - 使用 df.update() 时会导致此熊猫错误的原因是什么?传递值的形状是 (5624095, 10),索引意味着 (2322036, 10)
- javascript - 让 JS 应用于所有类元素的问题
- python - Python 在同一行上进行多次迭代
- java - 流映射的签名
- xaml - Xamarin:水平堆栈布局问题中的垂直位置