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。
我有一个 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。