簡體   English   中英

Django ModelForm從ForeignKey相關字段中添加其他字段

[英]Django ModelForm add extra fields from the ForeignKey related fields

# models.py
class Book(Model):
    title = CharField(max_length=100)
    publisher = ForeignKey('Publisher')

class Publisher(Model):
    name = CharField(max_length=100)
    address = TextField()

# forms.py
class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ('title', 'publisher__name', 'publisher__address',)

我正在嘗試細分ForeignKey字段,以便用戶可以在BookForm直接輸入發布BookForm

但是'publisher__name', 'publisher__address'不是有效的字段。

假設每個Book提交都將創建一個新的Publisher記錄。 如何使用Django Form實現此目的?

您可以在ModelForm聲明兩個字段,然后將它們保存在ModelForm.save()方法中:

class BookForm(ModelForm):
    # declare fields here
    publisher_name = CharField()
    publisher_address = TextField()

    class Meta:
        model = Book
        fields = ('title',)

    def save(self, commit=True):
        book = super(BookForm, self).save(commit=False)
        publisher = Publisher(name=self.cleaned_data['publisher_name'],
                              address=self.cleaned_data['publisher_address'])
        publisher.save()
        book.publisher = publisher
        if commit:
            book.save()
        return book

為你工作的例子

class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ('title', 'publisher')
    pub_name = forms.CharField(max_length=30, required=False)
    pub_addr = forms.CharField(max_length=30, required=False)
    def __init__(self, *args, **kwargs):
        super(BookForm, self).__init__(*args, **kwargs)
        self.fields['publisher'].required = False

    def clean(self):
        pub_name = self.cleaned_data.get('pub_name')
        pub_addr = self.cleaned_data.get('pub_addr')
        pub, created = Publisher.objects.get_or_create(name=pub_name, address=pub_addr)
        self.cleaned_data['publisher'] = pub
        return super(BookForm, self).clean()

在視圖中

#data = {'title':"Dd", "pub_name":"fff", "pub_addr":"Ddddsds"}
myform = = BookForm(data)
myform.save()

暫無
暫無

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

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