Django一个字段和多个Formset

时间:2019-12-06 08:04:05

标签: django

在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集成在一起。有什么帮助吗?

1 个答案:

答案 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