5

我只是在写一个表格。但是我想在hostname. 然后验证它if type = A是一个域名,否则type = PTR验证它是一个IP address。这个逻辑会在表单或视图中完成吗?

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 是混合形式还是子类化形式?

4

2 回答 2

7

为您的表单编写一个clean()方法。有关更多信息,请参阅有关清理和验证相互依赖的字段的 Django 文档。

您的clean方法应该返回cleaned_data 字典。在 clean 方法中,您不能实例化新的表单字段,但可以实例化验证器。

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.

于 2013-06-13T16:49:37.250 回答
-1

这个逻辑会在表单或视图中完成吗?

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

传递给 CacheCheck 类的表单是混合形式还是子类化形式?

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

于 2013-06-13T16:47:39.807 回答