【问题标题】:Django one field and multiple FormsetDjango一个字段和多个Formset
【发布时间】:2023-04-09 02:42:01
【问题描述】:

在 Django 中,我想创建一个包含 2 个 Models 的表单 - 一个 Library 模型和一个 Book 模型。 Library 可以包含多个Books。

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

【问题讨论】:

    标签: django


    【解决方案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)
    

    请记住,只要您对默认表单感到满意,就不需要在 inlineformset_factory 中指定自定义 form

    模板

    <form method="post"> {% csrf_token %}
        {{ formset }}
    </form>
    

    如果您想更好地控制表单在模板中的显示方式,请查看docs

    【讨论】:

    • 抱歉,我喜欢在 CBV 设置中执行此操作,抱歉忘记将其添加为要求
    • @bryanblackbee 如果你想使用 CBV,你应该使用 CreateView 并覆盖 getpost 方法。查看this,如果您无法完成这项工作,请告诉我(顺便说一句,我更喜欢使用 FBV,因为它们在这个用例中更加清晰)。
    猜你喜欢
    • 2017-10-24
    • 2019-04-15
    • 2023-04-02
    • 2018-07-23
    • 2021-10-22
    • 2021-10-10
    • 2012-11-21
    • 2015-02-11
    • 2012-07-04
    相关资源
    最近更新 更多