2013-06-07 2 views
0

ModelForm을 인라인으로 전달하는 데 도움이 필요합니다.외래 키 관계를 사용하여 인라인 할 모델

사용 가능한 IP 주소를 테스트해야합니다. 표준 ModelAdmin과 작동하지만 인라인으로 들어가야합니다. 하지만 외래 키를 사용하여 목록을 가져 오는 방법을 잘 모르겠습니다. 사용 가능한 IP 주소는 DslamSet 모델에 들어가야하며 IP 주소는 저장 중에 IP_block 모델에서 계산됩니다.

forms.py

class IP_blockForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(IP_blockForm, self).__init__(*args, **kwargs) 
     if self.instance and self.instance.ip_range: 

      split_range = self.instance.ip_range.split(' ') 
      ip_list_choices = zip(split_range, split_range) 

      self.fields['ip_list'] = forms.ChoiceField(choices=ip_list_choices) 

    class Meta: 
     model = IP_block 

내가이 일을 생각했지만, 작동하지 않습니다. "예외가 제공되지 않았습니다"라는 오류 메시지가 나타납니다.

class DslamSetForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(DslamSetForm, self).__init__(*args, **kwargs) 
     if self.instance and self.instance.ip_block.ip_range: 

      split_range = self.instance.ip_block.ip_range.split(' ') 
      ip_list_choices = zip(split_range, split_range) 

      self.fields['ip_list'] = forms.ChoiceField(choices=ip_list_choices) 

    class Meta: 
     model = DslamSet 

나는 잘못하고 있지만 확실하지는 않습니다. 도움을 환영합니다.

+0

"예외가 제공되지 않았습니다"에 대한 연구를하고 있었는데 form.is_valid()와 관련이 있습니다. 사용 가능한 IP 주소가 모델 선택 항목으로 저장되지 않았다고 생각합니다. 그것이 말하기 때문에, 존재하지 않습니다. – Infinixd

답변

0

솔루션을 찾은 것 같아요.하지만이 방법을 사용하는 것이 더 정확한 방법이라고 확신합니다.

class DslamSetForm(forms.ModelForm): 
    def clean(self, *args, **kwargs): 
     if self.cleaned_data and self.instance and self.instance.ip_block and self.instance.ip_block.ip_range and not self.instance.port: 
      super(DslamSetForm, self).clean(*args, **kwargs) 
      split_range = self.instance.ip_block.ip_range.split(' ') 
      ip_list_choices = zip(split_range, split_range) 
      self.fields['ip_address'] = forms.ChoiceField(choices=ip_list_choices)    

     return self.cleaned_data 


    class Meta: 
     model = IP_block