0

是否可以向 Django Model Field.choices 添加变量?

当我必须静态添加它时,我失去了功能。

IP_CHOICES = (
    ('192.168.1.0', '192.168.1.0'),
)

ip_address = models.IPAddressField(choices=IP_CHOICES, unique=True, blank=True)

我使用名为 IPy 的 Python IP 解释器来计算正确的 IP 块。

ip = IP(self.network + slash)

for rangeip in enumerate(ip[2:-1]):

    IP_CHOICES = (
        ("%s" %rangeip, "%s" %rangeip)
    )

这可能吗?如果是这样,请帮助。过去一周一直试图破解它,但无处可去。任何帮助表示赞赏。

请查看模型类。

#IP Block Class
class IP_block(models.Model):

    network = models.IPAddressField(unique=True)
    slash = models.ForeignKey(Subnet, verbose_name='CIDR')
    subnet = models.CharField(max_length=64, blank=True)
    gateway_ip = models.CharField(max_length=64, blank=True)
    broadcast_ip = models.CharField(max_length=64, blank=True)
    ip_range = models.TextField(blank=True, verbose_name='Available IP Range')
    dslam = models.ManyToManyField(Dslam, verbose_name='Dslam', blank=True)

    #ip block and range save function


    def save(self, *args, **kwargs):

        slash = unicode(self.slash)

        broadcast = IP(self.network + slash).broadcast()
        subnet = IP(self.network+slash).strNetmask()

        self.broadcast_ip = broadcast
        self.subnet = subnet

        ip = IP(self.network + slash)

        for gateway in ip[1]:
            self.gateway_ip = gateway

        #rangeip for loop

        ip = IP(self.network + slash)


        if self.ip_range:
            print 'no override'

        else:

            for rangeip in ip[2:-1]:
                self.ip_range += "%s\n" %rangeip

                IP_CHOICE = "(%s" %rangeip + ", %s)," %rangeip

                #ip_list select 

                ip_list = models.CharField(choices=IP_CHOICE, max_length=128, blank=True)

        super(IP_block, self).save(*args, **kwargs)


    class Meta:
        verbose_name_plural = 'IP Blocks'

    def __unicode__(self):
        return self.network         
4

1 回答 1

3

您在这里有许多相当基本的错误。例如,在您建议的语法中:

for rangeip in enumerate(whatever):
    IP_CHOICES = (do_something)

您应该很明显,每次循环都只是简单地覆盖 IP_CHOICES。在循环结束时,它将仅具有最后一次迭代的值,该值本身并不适合choices.

您多次使用相同的模式。请考虑一下它实际上在做什么。

但是在你的保存函数中还有一个更严重的错误,你有这行:

ip_list = models.CharField(choices=IP_CHOICE, max_length=128, blank=True)

我完全不知道你认为那在做什么。您不能在保存方法的中间定义字段。你可以设置一个字段的值,但你不能突然定义一个新字段(再次,请考虑一下:这将如何与数据库一起使用?记住字段是级别的属性:该模型的所有实例都需要具有相同的字段选择)。

几乎不可能理解你实际上想要做什么。ip_list一旦用户在另一个字段 ( ) 中设置了范围,我认为您正在尝试为模型 ( ) 中的一个字段提供 IP 地址选择ip_range。(如果您事先明确说明,那将会很有用。)

这样做的地方是在表格中,而不是在模型中。在模型字段上设置choices实际上只是在从该模型自动创建的表单上设置它们的快捷方式,但是如果您需要做一些动态的事情,您需要自己定义表单并将逻辑放在那里。我想它会是这样的:

class IPBlockForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(IPForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.ip_range:
            ip_list_choices = get_ip_list_from_wherever(self.instance_ip_range)
            self.fields['ip_list'] = forms.ChoiceField(choices=ip_list_choices)

    class Meta:
        model = IP_block

但是自然地,您首先需要修复save方法中的其他逻辑错误,我在上面提到过。

于 2013-06-05T08:32:01.590 回答