2013-06-05 3 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) 

정확한 IP 블록을 계산하기 위해 IPy라는 Python 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

또한 다음과 같이 할 수 있습니다 :'choices = tuple (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) 

나는 당신이 그 일을한다 생각 전혀 생각을 가지고있다. save 메소드의 중간에 필드를 정의 할 수 없습니다. 필드의 값을 설정할 수는 있지만 갑자기 새로운 필드를 정의 할 수는 없습니다 (다시 말하면 을 생각해보십시오 : 데이터베이스와 어떻게 작동합니까?) 필드는 클래스 레벨임을 기억하십시오. 모델에 동일한 필드 선택이 필요함).

실제로 무엇을하려고하는지 이해하는 것은 거의 불가능합니다. 사용자가 다른 필드 (ip_range)에 범위를 설정하면 모델의 한 필드 (ip_list)에 대해 IP 주소의 선택을 제공하려고합니다. (명시 적으로 앞에 명시한 경우 유용했을 것입니다.)

이 작업을 수행 할 곳은 모델이 아니라 양식입니다. 모델 필드에 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