2015-09-17 37 views
0

複雜的模型:Django的什麼變量過濾

Class Name(models.Model): 
    first_name = models.CharField(max_length=50,blank=True) 
    middle_name = models.CharField(max_length=50, blank=True) 
last_name = models.CharField(max_length=50, blank=True) 

class Person(models.Model): 
    names = models.ManyToManyField('Name') 
    wives = models.ManyToManyField('Person',related_name='husbands',null = True, blank = True) 

及形狀:

class PersonForm(ModelForm): 
    names_list = forms.ModelMultipleChoiceField(queryset=Name.objects.filter(person=2), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 
    wives_list = forms.ModelMultipleChoiceField(queryset=Person.objects.filter(husbands=2), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 

    class Meta: 
     model = Person 
     fields = ('names','wives') 
     widgets = { 
     'names' : forms.HiddenInput(), 
     'wives': forms.HiddenInput(), 
     } 

這是硬編碼的人2號(人= 2,丈夫= 2)。

它的工作原理。但是現在,我想把2號變成與當前編輯人員相關的變量。

如果我看html源代碼 - 我可以看到隱藏字段:

<input id="id_names" name="names" type="hidden" value="[30, 63]" /> 

<input id="id_wives" name="wives" type="hidden" value="[42]" /> 

所以 - 有兩種方式:

Name.objects.filter(person=somevariable) - 顯示的人數名

Name.objects.fiter(id__in=othervariable) - 顯示名稱中的值變量

(與妻子同)

但沒有任何工程 - 尤其是 - 我無法找到合適的變量 - 我是如此接近....

回答

0

我發現的主要錯誤 - 我不能在類中設置id,因爲它尚未設置。它在__init__的構造函數中設置。所以我必須改變它:

class PersonForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
    super(PersonForm, self).__init__(*args, **kwargs) 
    instance = getattr(self, 'instance', None) 
    if instance and instance.pk: 
     self.fields['names_list'].queryset=Name.objects.filter(person=instance.pk) 
     self.fields['wives_list'].queryset=Person.objects.filter(husbands=instance.pk) 

    names_list = forms.ModelMultipleChoiceField(queryset=Name.objects.none(), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 
    wives_list = forms.ModelMultipleChoiceField(queryset=Person.objects.none(), widget=forms.CheckboxSelectMultiple(attrs={"checked":""})) 

    class Meta: 
     model = Person 
     fields = ('names','wives') 
     widgets = { 
     'names' : forms.HiddenInput(), 
     'wives': forms.HiddenInput(), 
     } 

如果有人發現更好的解決方案 - 我將不勝感激。