我正在尝试创建一个将使用外键更新表的ModelForm。我有什么似乎工作,但我希望有人可以告诉我,如果有更好的方法来做到这一点,或者如果我在下面的方式有问题。
在Author和Genres表上使用查询集是否正确?感觉就像我应该在Book模型上使用查询集,并将外键与这些表相关联。
models.py
class Author(models.Model):
name = models.CharField(max_length=200)
class Genre(models.Model):
name = models.CharField(max_length=200)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey('Author')
genre = models.ForeignKey('Genre')
forms.py
class BookForm(ModelForm):
title = forms.CharField(max_length=200)
author = forms.ModelChoiceField(queryset=Author.objects.all())
genre = forms.ModelChoiceField(queryset=Genre.objects.all())
class Meta:
model = Book
fields = ['title', 'author', 'genre']
views.py
def add_book(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
form.save(commit=True)
return HttpResponseRedirect('/add/')
else:
form = BookForm()
答案 0 :(得分:4)
此代码唯一的问题是您要覆盖模型表单的默认行为。 将其更改为:
class BookForm(ModelForm):
class Meta:
model = Book
fields = ['title', 'author', 'genre']
让django处理那些定义。 如果您需要添加标签或小部件,可以在Meta类中定义它们:
class BookForm(ModelForm):
class Meta:
model = Book
fields = ['title', 'author', 'genre']
labels = {'title': 'Book title', }
例如。
答案 1 :(得分:0)
我不确定你在这里问的是什么,或者为什么你想要Book上的查询集。
您实际上并未更改任何字段的任何默认值,因此无需重新定义它们:您的表单可能只是
class BookForm(ModelForm):
class Meta:
model = Book
它会完全相同。