django 形式:将参数传递给 is_valid

django form: pass parameter to is_valid

我有一个 abstract form 和 2 个使用它的表格。在抽象形式的 is_valid 方法中,我检查一个条件,该条件取决于调用该方法的形式。 该行是:

if eval(self.cleaned_data.get("validated_modif")):

根据表格,应将其替换为以下行之一:

if act.validated_attendance==0: #MinAttend form
if act.validated<2: #Act form

我有一个有效的代码。但它非常(非常)脏,我正在寻找更好的主意。

forms.py:

class AbstractModif(forms.Form):
    releve_mois_modif=forms.IntegerField(min_value=1, max_value=12)

    class Meta:
        #abstract form
        abstract = True

    #check if the searched act already exists in the db and has been validated
    def is_valid(self, *args, **kwargs):
        # run the parent validation first
        valid=super(AbstractModif, self).is_valid()

        # we're done now if not valid
        if not valid:
            return valid

        #if the form is valid
        Model=Act
        fields={}
        fields["releve_mois"]=self.cleaned_data.get("releve_mois_modif")

        try:
            act=Model.objects.get(**fields)
            if Model!=Act:
                act=act.act
            #MinAttend form: check act.validated_attendance=0
            #Act form: check act.validated<2
            if eval(self.cleaned_data.get("validated_modif")):
                self._errors['__all__']=ErrorList([u"The act you are looking for has not been validated yet!"])
                return False
        except Exception, e:
            self._errors['__all__']=ErrorList([u"The act you are looking for doesn't exist in our database!"])
            print "exception", e
            return False

        # form valid -> return True
        return True

form_1.py:

class Modif(AbstractModif):
    #fake field for the is_valid method
    validated_modif=forms.CharField(widget=forms.HiddenInput(), initial="act.validated<2")

form_2.py

class Modif(AbstractModif):
    #fake field for the is_valid method
    validated_modif=forms.CharField(widget=forms.HiddenInput(), initial="act.validated_attendance==0")

form.html

<!-- hidden field for the is_valid method of the form -->
{{ modif.validated_modif }}

我使用eval和一个hidden field的初始值来检查条件。你有更好的解决方案吗?

谢谢!

这是一个非常糟糕的主意。您正在 运行 对从浏览器收到的输入进行评估。那么如果我使用浏览器开发工具将隐藏字段的内容修改为os.system('rm -rf /'),你认为会发生什么?

我完全看不出有任何必要这样做。你有两个表单 subclasses;你为什么不简单地将验证放在那些子 classes 的方法中?

class Form1(AbstractForm):
    def validate_modif(self, act):
        return act.validated < 2

class Form(AbstractForm):
    def validate_modif(self, act):
        return act.validated_attendance == 0

您只需调用 self.validate_modif(act) 即可执行验证。

另请注意,您应该而不是覆盖is_valid(),而是clean()。你的 Meta class 什么都不做,因为这是一个普通的表单,而不是一个 ModelForm。