2013-06-05 47 views
0

是否可以添加一個變量到Django Model Field.choices?是否可以添加一個變量到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   
+0

你得到的錯誤是什麼? 「IP(self.network + slash)'返回什麼? – karthikr

+0

此外,你可以這樣做:'選擇=元組(zip(ip,ip))' – karthikr

+0

ip = 192.168.1.0/27 - 這是ip塊。 – Infinixd

回答

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) 

我完全不知道你怎麼想的是在做什麼。您不能在保存方法的中間定義一個字段。你可以設置一個字段的值,但是你不能突然定義一個新的字段(再次,請認爲關於它:這將如何與數據庫一起工作?記住字段是 -level屬性:所有的實例模型需要具有相同的字段選擇)。

幾乎不可能理解你實際要做的事情。我想你試圖爲模型中的一個字段(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方法,我在上面提到,第一。

+0

明天我會放棄這件事,會讓你知道發生了什麼。謝謝您的幫助。 – Infinixd

+0

+1爲努力去做所有的細節... –

+0

我得到它與解決方案一起工作,但我需要工作的唯一事情就是名單。在選擇字段中,它顯示所有IP在同一行上。我需要將IP地址顯示爲多個選項而不是一個選項。謝謝你的幫助! – Infinixd

相關問題