在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)
现在,我用Library
创建了一个id=1
,现在想创建一个表单以将多本图书标记到图书馆中。如何创建表单,使字段看起来像(包括预填库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
集成在一起。有什么帮助吗?
答案 0 :(得分:1)
基本上,您的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)
请记住,只要您对默认格式感到满意,就无需在form
中指定自定义inlineformset_factory
。
模板:
<form method="post"> {% csrf_token %}
{{ formset }}
</form>
如果要进一步控制表单在模板中的显示方式,请选中docs。