簡體   English   中英

在Django中將外鍵子項添加到模型表單中

[英]Add foreign key children to model form in 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實例構建Contact表單時,如何使用現有值填充此聯系類型字段?

編輯:為了澄清,我希望為這四個選項中的每一個創建一個復選框,如果表單是使用模型實例實例化的,那么我希望檢查每個存在的相關對象的復選框,類似於與其他字段自動發生。

我可能會這樣構建模型,因此我可以在創建/編輯聯系人時選擇哪種聯系人類型。 如果ContactType與ManyToMany相關,我們會自動在ModelForm中獲取ModelMultpleChoiceField,我們需要做的就是使用CheckboxSelectMultiple小部件來獲取您正在尋找的輸出。

當我們將Contact的一個實例傳遞給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()

你嘗試過這樣的事嗎?

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})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM