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

Python Django自定义表单验证IP地址和域名,python,django,Python,Django,我只是在写一张表格。但是,我想对主机名执行自定义验证。如果是type=A,则验证它是否为域名;如果是type=PTR则验证它是否为IP地址s。这个逻辑是在表单还是视图中完成的 RECORD_CHOICES = ( ('A','A'), ('Cname','CNAME'), ('PTR', 'PTR'), ) class CacheCheck(forms.Form): type = forms.TypedChoiceField(choices=for

我只是在写一张表格。但是,我想对
主机名执行自定义验证。如果是
type=A
,则验证它是否为域名;如果是
type=PTR
则验证它是否为
IP地址
s。这个逻辑是在表单还是视图中完成的

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}'
另外,传递给CacheCheck类的forms.Form是mixin的形式还是子类化的形式?

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

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}'
两个地方。在客户端用javascript进行验证,以避免愚蠢的错误占用服务器资源。然后在服务器端进行验证,以避免数据库中存在错误数据

传递给CacheCheck类的表单这是mixin的形式还是子类化的形式

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

为表单编写
clean()
方法。有关更多信息,请参阅上的Django文档

您的
clean
方法应返回已清理的\u数据字典。在清理后的方法中,您不能实例化新的表单字段,但可以使用验证器

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的子类。因此,如果我在所有表单中都需要相同的函数clean self,那么您会建议什么是最好的方法,以便我“干燥”:o)感谢您对far的所有帮助……如果您有一个模型,您可以将验证放在模型的方法中,所有模型表单都将使用它。否则,请使用继承。使用clean方法创建表单,并在需要验证时将其子类化。谢谢。我仍然有一个问题,但我没有张贴这内