django form:将参数传递给is_valid

时间:2015-03-04 14:45:03

标签: django forms validation parameter-passing abstract

我有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 }}

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

谢谢!

1 个答案:

答案 0 :(得分:1)

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

我根本看不到任何需要。你有两个表单子类;为什么不简单地将验证放在那些子类中的方法中?

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类什么都不做,因为这是一个普通的Form,而不是ModelForm。