为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白衣非少年 2021-03-30 09:02:40
我只是在写表格。但是我想在上执行自定义验证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}'传递给CacheCheck类的form.Form也是mixin或子类的形式吗?
查看完整描述

3 回答

?
慕哥6287543

TA贡献1831条经验 获得超10个赞

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


您的clean方法应返回cleaned_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。


查看完整回答
反对 回复 2021-04-01
?
慕少森

TA贡献2019条经验 获得超9个赞

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

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

传递给CacheCheck类的形式是混入还是子类化的形式?

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


查看完整回答
反对 回复 2021-04-01
  • 3 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号