我正在尝试创建一个处理域检查的表单:表单应该基于之前在另一个表单中设置的变量而失败。
基本上,当用户想要创建新域时,如果输入的域存在,则此表单将失败。
当用户想要移动域时,如果输入的域不存在,则此表单将失败。
我试过让init
动态重载,但看不到让我传递varbele到clean函数的方法。
我已经读过这个动态验证可以使用工厂方法完成,但也许有人可以帮我解决这个问题吗?
到目前为止,这是表单的简化版本:
#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
答案 0 :(得分:1)
覆盖__init__
是可行的方法。在该方法中,您只需将值设置为实例变量即可。
def __init__(self, *args, **kwargs):
self.myvalue = kwargs.pop('myvalue')
super(MyForm, self).__init__(*args, **kwargs)
现在self.myvalue
可以任何形式提供。
答案 1 :(得分:0)
您是否有存储域名的模型?如果是这样,您希望使用ModelForm并在模型中存储实际域的任何字段上设置unique = True。从Django 1.2开始,您甚至可以在模型中进行任何其他验证,而不是表单。