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方法创建表单,并在需要验证时将其子类化。谢谢。我仍然有一个问题,但我没有张贴这内