如何在Django中动态实现表单验证?
我正在尝试制作一个表单,用来检查域名是否有效:这个表单应该根据之前在另一个表单中设置的变量来判断是否失败。
简单来说,当用户想要创建一个新域名时,如果输入的域名已经存在,这个表单就应该失败。
而当用户想要转移一个域名时,如果输入的域名不存在,这个表单也应该失败。
我尝试过让它动态地重载 init
,但找不到办法把我传入的变量传递给清理函数。
我听说可以通过工厂方法来实现这种动态验证,但也许有人可以帮我理清思路?
这是目前表单的简化版本:
#OrderFormStep1 presents the user with a choice: create or move domain
class OrderFormStep2(forms.Form):
domain = forms.CharField()
extension = forms.CharField()
def clean(self):
cleaned_data = self.cleaned_data
domain = cleaned_data.get("domain")
extension = cleaned_data.get("extension")
if domain and extension:
code = whoislookup(domain+extension);
#Raise error based on result from OrderFormStep1
#raise forms.ValidationError('error, domain already exists')
#raise forms.ValidationError('error, domain does not exist')
return cleaned_data
2 个回答
0
你有没有一个模型用来存储域名?如果有的话,你可以使用一个叫做 ModelForm 的东西,并且在模型中存储实际域名的字段上设置 unique=True,这样就能确保每个域名都是唯一的。从 Django 1.2 开始,你甚至可以在模型内部进行额外的验证,而不只是依赖表单。
1
重写 __init__
方法是个不错的选择。在这个方法里,你可以把你的值直接设置为一个实例变量。
def __init__(self, *args, **kwargs):
self.myvalue = kwargs.pop('myvalue')
super(MyForm, self).__init__(*args, **kwargs)
现在 self.myvalue
可以在任何其他方法中使用了。