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)
    )

これは可能ですか?もしそうなら、助けてください。この 1 週間、ハッキングを試みましたが、どこにも行きませんでした。どんな助けでも大歓迎です。

モデルクラスをご覧ください。

#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)

それが何をしているとあなたが考えているか、私にはまったくわかりません。save メソッドの途中でフィールドを定義することはできません。フィールドの値を設定することはできますが、突然新しいフィールドを定義することはできません (もう一度考えてみてください: それはデータベースでどのように機能するでしょうか? また、フィールドはクラスレベルの属性であることを思い出してください: そのモデルのすべてのインスタンスが持つ必要があることを覚えておいてください)。同じフィールド選択)。

実際に何をしようとしているのかを理解することはほとんど不可能です。ip_listユーザーが別のフィールド ( ) で範囲を設定すると、モデル内の 1 つのフィールド ( ) に 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 に答える