在 Django 中,我想创建一个涉及 2 个Models
的表单 - 一个Library
模型和一个Book
模型。Library
可以包含多个Book
。
class Library(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
for_library = models.ForeignKey(Library, null=False, on_delete=models.PROTECT)
title = models.CharField(max_length=200)
author = models.CharField(max_length=100)
现在,我已经创建了一个带有id=1
的Library
,现在想要创建一个表单来将多本书标记为图书馆。如何创建表单,使字段如下所示(包括预填写库 ID(:
Library: <id=1 Library>
Book1 Title: _____
Book1 Author: _____
Book2 Title: _____
Book2 Author: _____
我走得最远的是:
BookFormset = inlineformset_factory(Library, Book,
fields=['title', 'author'], form=CreateBookForm, extra=2, min_num=1, max_num=20,
can_delete=True)
但是无法继续,也不确定是否将其与views.py
集成.对此有任何帮助吗?
基本上,你的views.py
中应该有这样的东西:
def library_books(request, library_pk):
if request.method == 'POST':
library = Library.objects.get(pk=pk)
formset = forms.BookFormset(request.POST, instance=library)
if formset.is_valid():
formset.save()
# ...
在forms.py
:
from .models import Library, Book
BookFormset = inlineformset_factory(Library, Book,
fields=['title', 'author'], extra=2, min_num=1, max_num=20,
can_delete=True)
请记住,只要您对默认表单感到满意,就不需要在inlineformset_factory
中指定自定义form
。
模板:
<form method="post"> {% csrf_token %}
{{ formset }}
</form>
如果您想更好地控制表单在模板中的显示方式,请查看文档。