![](/img/trans.png)
[英]Django - ModelForm with fields derived from ForeignKey attributes
[英]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.