Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django管理CIDR类型_Python_Django_Admin_Cidr - Fatal编程技术网

Python Django管理CIDR类型

Python Django管理CIDR类型,python,django,admin,cidr,Python,Django,Admin,Cidr,问题是我正在处理一个Django管理项目,它应该能够接受CIDR格式的数据并将其放入数据库(Postgres) 假设我有一个模型: ################################################## class CIDR(models.Model): .... net_cidr = models.IPAddressField(unique=True) .... def __unicode__(self): ret

问题是我正在处理一个Django管理项目,它应该能够接受CIDR格式的数据并将其放入数据库(Postgres)

假设我有一个模型:

##################################################
class CIDR(models.Model):
    ....
    net_cidr = models.IPAddressField(unique=True)
    ....

    def __unicode__(self):
        return self.net_cidr

##################################################
基于上述代码,数据库中的
net\u cidr
字段为inet类型,支持cidr格式数据。但是,
IPAddressField
不支持CIDR(至少对我不起作用)。如果我想在我的管理站点上输入诸如“128.66.0.0/16”之类的内容,Django将弹出一个错误,告诉我“输入有效的IPv4地址”

我已经尝试将字段类型更改为Char,它当然可以工作。但是,在数据库中将CIDR设置为varchar不是一个好主意

基本上,我想要的是让
net\u cidr
能够访问IP范围,如“128.66.0.0-128.66.255.255”或cidr块“128.66.0.0/16”,并将其作为 “128.66.0.0/16”


我认为关键部分是如何让
IPAddressField
接受字符串类型(如IP范围或CIDR块)数据。然后我可以将其转换为CIDR块并保存到数据库。

有很多方法可以实现您所需要的

我要做的是将
net\u cidr
定义为
models.CharField

然后为要在其中实现的模型定义一个modelform
clean\u net\u cidr
功能

class CIDRForm(ModelForm):
    def clean_net_cidr(self):
        # do your magic processing here

    class Meta:
        model = CIDR
然后将该表单传递给模型管理对象

class CIDRAdmin(admin.ModelAdmin):
    form = CIDRForm

更新:

根据你的评论,这似乎正是你所需要的。


在其他字段中,它包括一个
CIDRADressField

CIDR不是IP地址格式。它用于表示网络。也许你可以使用django的RegexField来实现你想要的。@rantanplan:问题是RegexField是一个表单字段,我如何在我的模型中使用它?模块“models”没有这样的字段。实际上,我以前试过这个。真的很管用。但是,如果查看数据库模式,您会注意到net_cidr的数据类型是varchar。为我的管理网站。这不是问题,但是还有其他人需要将其他脚本应用到数据库中,他们需要将这个netcidr作为inet类型。不过,谢谢你的建议。我想我有办法做到这一点。在模型中将net_cidr定义为IPAddressField,并在表单中将其重写为CharField。现在,它解决了我的问题。@FanyongMeng是的,它与我的建议类似,但在我在更新中提到的链接中,你会看到它提供了本机postgresql
cidr
类型。哈,你知道吗,我也试过了。我认为这是可行的,但对我来说不是。我不知道为什么当我尝试将它应用到我的应用程序时,它会一直弹出一些愚蠢的错误。我甚至试着联系犯下这件事的人。不管怎样,我想我找到了解决问题的办法。谢谢老兄~@FanyongMeng嗯,很有趣。他们确实提到了几个bug,他们将这些bug归因于django代码,而不是它们的实现。不管怎样,不客气。