Django:验证字段组合的简单方法?

时间:2014-03-28 17:08:27

标签: python django forms validation

在Django中,测试

之类的东西

a)已填写两个字段中的至少一个,如果没有发出错误消息;或

b)因为已经填写了一个字段,所以需要另一个字段,并在现在需要的字段上添加错误消息

是在form.clean方法中测试它。

这是一项常见且重复的任务。是否有一个库在clean内简化了此类测试的编写?最好是声明性的一个?

2 个答案:

答案 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()
        ...
    ...