在Django中,测试
之类的东西a)已填写两个字段中的至少一个,如果没有发出错误消息;或
b)因为已经填写了一个字段,所以需要另一个字段,并在现在需要的字段上添加错误消息
是在form.clean
方法中测试它。
这是一项常见且重复的任务。是否有一个库在clean
内简化了此类测试的编写?最好是声明性的一个?
答案 0 :(得分:0)
如果有一个库可以做到这一点,我会感到惊讶,因为很难概括。例如,我构造了非常具体的错误消息,以确保用户知道发生了什么:"由于你填写了X和Y,你还必须包含一个Z."
但是,在您的情况下,可能值得花时间自己做这件事。如果我这样做,我会创建一个BaseForm的子类来在这些情况下使用。这是一个非常粗略的轮廓(未经测试):
class CrossRequirementsForm(BaseForm):
# subclasses set this attribute:
# cross_requirements_fields = {'foo': ('bar', 'baz',), 'height': ('weight',)}
def clean(self):
if self.cross_requirements_fields:
for required_field, if_other_fields = self.cross_requirements_fields.items():
if all([self.cleaned_data[f] for f in if_other_fields]):
if not self.cleaned_data[required_field]:
raise ValidationError('{} is required since {} are set'.format(
required_field, if_other_fields
))
然后,您的子类可以这样做:
class MyForm(CrossRequirementsForm):
cross_requirements_fields = {'foo': ('bar', 'baz',), 'height': ('weight',)}
如果他们覆盖干净,请务必调用super.clean。
答案 1 :(得分:-1)
您可以为以下形式编写简单的mixin:
from django.core import forms
class AwesomeFormMixin(object):
def clean(self):
for field in self.fields_to_process:
#process fields here
class MyForm(AwesomeFormMixin, forms.Form):
fields_to_process = ['this_field', 'that_field']
...
def clean(self):
super(MyForm, self).clean()
...
...