如何在Django中动态实现表单验证?

0 投票
2 回答
709 浏览
提问于 2025-04-15 23:14

我正在尝试制作一个表单,用来检查域名是否有效:这个表单应该根据之前在另一个表单中设置的变量来判断是否失败。

简单来说,当用户想要创建一个新域名时,如果输入的域名已经存在,这个表单就应该失败。

而当用户想要转移一个域名时,如果输入的域名不存在,这个表单也应该失败。

我尝试过让它动态地重载 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 可以在任何其他方法中使用了。

撰写回答