【问题标题】:Django admin CIDR typeDjango 管理员 CIDR 类型
【发布时间】:2013-01-14 20:15:43
【问题描述】:

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

假设我有一个模型:

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

    def __unicode__(self):
        return self.net_cidr

##################################################

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

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

基本上我想要的是让net_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 块并将其保存到数据库中。

【问题讨论】:

  • CIDR 不是 IP 地址格式。它用于表示网络。也许你可以使用 django 的 RegexField 来实现你想要的。
  • @rantanplan:问题是 RegexField 是一个表单字段,如何在我的模型中使用它?模块“模型”没有这样的字段。

标签: python django admin cidr


【解决方案1】:

有很多方法可以满足您的需求。

我要做的是将net_cidr 定义为models.CharField

然后为您要实现的模型定义一个模型表单 clean_net_cidr 函数。

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

    class Meta:
        model = CIDR

然后将该表单传递给模型管理对象

class CIDRAdmin(admin.ModelAdmin):
    form = CIDRForm

更新:

根据您的 cmets,这似乎正是您所需要的。 https://github.com/jimfunk/django-postgresql-netfields

在其他字段中,它包括CidrAddressField

【讨论】:

  • 其实这个我也试过了。它确实有效。但是,如果您查看数据库模式,您会注意到 net_cidr 的数据类型是 varchar。对于我的管理站点。没问题,但是有其他人需要将其他脚本应用到数据库,他们需要这个 net_cidr 作为 inet 类型。不过,谢谢你的建议。
  • 我想我有办法做到这一点。在模型中将 net_cidr 定义为 IPAddressField,并在表单中将其覆盖为 CharField。目前,它解决了我的问题。
  • @FanyongMeng 是的,这与我的建议类似,但在我在更新中提到的链接中,您会看到它提供了 native postgresql cidr 类型。
  • 哈,你知道吗,我也试过了。我认为这有效,但不适合我。我不知道为什么当我尝试将它应用到我的应用程序时它会弹出一些愚蠢的错误。我什至试图联系犯下它的人^_^。无论如何,我想我找到了解决它的方法。谢谢大佬~
  • @FanyongMeng 嗯,很有趣。他们确实提到了一些错误,它们归因于 django 代码而不是它们的实现。无论如何,不​​客气。
猜你喜欢
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 2015-12-26
  • 2010-10-12
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多