Django自定义表单验证IP地址和域名

时间:2013-06-13 16:44:51

标签: python django

我只是在写一个表格。但是,我想在hostname上执行自定义验证。如果if type = A type = PTR验证它是IP addres,则RECORD_CHOICES = ( ('A','A'), ('Cname','CNAME'), ('PTR', 'PTR'), ) class CacheCheck(forms.Form): type = forms.TypedChoiceField(choices=formfields.TYPE_CHOICES, initial='FIXED') record = forms.TypedChoiceField(choices=formfields.RECORD_CHOICES, initial='FIXED') hostname = forms.CharField(max_length=100) def clean(self): cleaned_data = super(CacheCheck, self).clean() record = cleaned_data.get("record") if record == "PTR": hostname = forms.GenericIPAddressField(label=("ip address")) else record == "A": hostname = forms.RegexField(label=("hostname"), max_length=31, regex=r'[a-zA-Z0-9-_]*\.[a-zA-Z]{2,6}' 然后验证它是域名。这个逻辑是在表单还是视图中完成的?

{{1}}

传递给CacheCheck类的forms.Form是mixin还是子类的一种形式?

2 个答案:

答案 0 :(得分:5)

为您的表单编写clean()方法。有关详细信息,请参阅cleaning and validating fields that depend on each other上的Django文档。

您的clean方法应该返回cleaning_data字典。在已清理的方法中,您无法实例化新的表单字段,但您可以使用验证器。

from django.core.validators import validate_ipv46_address, RegexValidator

validate_hostname = RegexValidator(regex=r'[a-zA-Z0-9-_]*\.[a-zA-Z]{2,6}')

def clean(self):  
    cleaned_data = super(CacheCheck, self).clean()
    record = cleaned_data.get("record")
    hostname = cleaned_data.get(hostname, "")

    if record == "PTR":
        validate_ipv46_address(hostname)
    elif record == "A":
        validate_hostname(hostname)
        # todo: check length of hostname as well

    return cleaned_data

要回答您的其他问题,您的CacheCheck类是forms.Form的子类。

答案 1 :(得分:-1)

这个逻辑是在表单还是视图中完成的?

两个地方。在客户端使用javascript进行验证,以避免对您的服务器资源造成严重错误。然后在服务器端进行验证,以避免数据库中出现错误数据。

传递给CacheCheck类的表单是mixin还是子类的一种形式?

这是一种子类化的形式。 CacheCheck继承Form。