2011-07-26 33 views
0

我有以下Django模型來模擬形式:添加外鍵兒童在Django

class Contact(models.Model): 
    id #primary key 
    #Other contact info 

class ContactType(models.Model): 
    contacttype_choices=(('Primary', 'Primary'), 
         ('Billing', 'Billing'), 
         ('Business', 'Business'), 
         ('Technology', 'Technology')) 
    contact=models.ForeignKey(Contact) 
    type=models.CharField(choices=contacttype_choices, max_length=30) 
    class Meta: 
     unique_together=('contact', 'type') 

所以任何接觸對象最多可有四個接觸的類型,每種類型要麼是存在或不存在。我想爲Contact製作一個模型表單,其中有一個多選字段,用於聯繫人類型。當我使用Contact實例構造聯繫人表單時,如何使用現有值填充此聯繫人類型字段?爲了澄清,我希望爲這四個選項中的每一個都創建一個複選框,並且如果表單是用模型實例實例化的,那麼我希望檢查每個相關對象的複選框存在,類似於其他字段自動發生的情況。

+0

你明白這句話的完成? ...「所以任何聯繫對象都可以有聯繫類型。」 – jcfollower

+0

謝謝,我錯過了。我現在修好了。 – murgatroid99

+0

這對你有幫助嗎? [Django多選字段](http://stackoverflow.com/questions/2726476/django-multiple-choice-field-checkbox-select-multiple) – jcfollower

回答

1

我可能會結構模型正因爲如此,所以創建/編輯聯繫人時,我可以選擇接觸式。如果ContactType與ManyToMany相關,我們會自動在ModelForm中獲得一個ModelMultpleChoiceField,而我們所需要做的就是使用CheckboxSelectMultiple小部件來獲取您要查找的輸出。

當我們通過聯繫到的ContactForm的一個實例,Django會綁定任何預選ContactType選擇和檢查複選框我們。

設置每個ContactType的獨特的標題做一樣的接觸和CONTACT_TYPE unique_together。

#models.py 
class Contact(models.Model): 
    #other fields 
    contact_types = models.ManyToMany(ContactType) 

class ContactType(models.Model): 
    title = models.CharField(max_length=20, unique=true) 

#forms.py 
class ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 

    def __init__(self, *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.fields['contact_types'].widget = forms.CheckboxSelectMultiple() 
+0

我的問題不在於創建選項(或者甚至是在模型和視圖之間重複它們)。我的問題是,當一個模型表單用一個模型實例實例化時,它會用該實例的值預填充表單字段,並且我想在不直接屬於該模型的其他字段中複製該行爲。 – murgatroid99

+0

我要修改我的答案,因爲我不認爲在給定模型的當前狀態的情況下你能夠做到你想要的。 – Brandon

+0

是的,@ waffle的示例工作正常,但我不認爲具有聯繫人外鍵的ContactType是對這些信息建模的最佳方式。我的$ 0.02。 – Brandon

1

你試過類似的東西嗎?

class ContactForm(forms.ModelForm): 
    class Meta: 
     model = Contact 
    def __init__(self, *args, **kwargs): 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.fields['contacttypes'] = forms.MultipleChoiceField(
      choices = CONTACT_TYPE_CHOICES, 
      label = "contact type", 
      widget = CheckBoxSelectMultiple 
     ) 

contact = Contact.objects.get(pk=1) # or whatever 
types = ContactType.objects.filter(contact = contact) 
form = ContactForm(instance=contact, initial={'contacttypes' : types}) 
+0

這是成功的,除了我不需要在初始化程序中定義附加字段,並且在第二個查詢的末尾添加了'.values_list('type',flat = True)''。我不認爲這會起作用,因爲'initial'的文檔說「如果沒有提供特定的值,它們不會被用作回退值」,並且我誤解了它。 – murgatroid99

+0

因爲你上面引用的原因,我會建議在init中定義與選擇的字段。雖然這次可能沒有明確的定義,但我認爲你不應該依賴這種行爲。 –