【发布时间】:2020-11-27 16:44:54
【问题描述】:
我正在使用 Django 2.2
我正在通过读取 JSON 定义文件动态创建表单;配置文件指定小部件的类型、允许的值等。
但是,我对 Select 小部件有点不满意,因为我在列表中的允许值列表前添加了一个“--”(这样我就会知道用户何时没有选择项目)。
这是创建 Select 小部件的代码 sn-p:
class myForm(forms.Form):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# ...
elif widget_type_id == WIDGET_TYPE_DROPDOWN:
CHOICES.insert(0,('-', INVALID_SELECTION))
form_field = CharField(label=the_label, widget=Select(choices=CHOICES),required=is_required)
我的问题是,当在我的表单上调用 is_valid() 方法时,无论选择如何,任何呈现的 Select 小部件都被接受为有效。
我想实现具有这种逻辑的代码(下面的伪代码):
def is_valid(self):
for field_name, field in self.fields.items():
if isinstance(field.type, Select):
if field.required and field.selected_value == INVALID_SELECTION:
return False
return super().is_valid()
实现此功能的正确方法是什么?例如,我什至如何获取字段的选定值(在表单代码中)?
【问题讨论】:
-
如果你使用
(None, INVALID_SELECTION)会怎样?None而不是- -
可能您可以为选择字段动态添加
clean_field_name方法并覆盖验证行为。
标签: django django-forms