我有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
的初始值来检查条件。你有更好的解决方案吗?
谢谢!
答案 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。