gpt4 book ai didi

django - 如何在 Django 中获得内联表单集的反向内容?

转载 作者:行者123 更新时间:2023-12-02 21:57:26 25 4
gpt4 key购买 nike

请参阅下面的 the documentation of Django 中的示例:

from django.db import models

class Author(models.Model):
name = models.CharField(max_length=100)

class Book(models.Model):
author = models.ForeignKey(Author)
title = models.CharField(max_length=100)

If you want to create a formset that allows you to edit books belonging to a particular author, you could do this:

>>> from django.forms.models import inlineformset_factory
>>> BookFormSet = inlineformset_factory(Author, Book)
>>> author = Author.objects.get(name=u'Mike Royko')
>>> formset = BookFormSet(instance=author)

这是作者与图书之间的一对多关系,并提供了一种为单个作者编辑图书的简单方法。

现在我想做相反的事情:一个用于编辑/创建作者的表单,其中包含要编辑/创建的内联书籍表单集。我怎么做?我真的更喜欢一种使用 ModelForms 来完成此操作的方法,并且不需要创建所涉及模型之一的实例。

例如:

添加作者表单

  • 作者姓名:[________]
  • 书籍:
    • 标题:[________]
    • 标题:[________]
    • 标题:[________]
    • (添加更多)
  • [保存]

注意:此时我需要这个,但没有任何 Authors 实例。

我可能在这里错过了一些简单的东西,并且我在这里的文档上花了太多时间。欢迎提供一些帮助!

最佳答案

我会在同一 View 中使用 AuthorModelFormBookModelFormset 来完成此操作。像这样的事情:

# in forms.py:
AuthorForm = modelform_factory(Author)
BooksFormset = modelformset_factory(Book, extra=3, fields=('title',))

# in views.py:
if request.method == POST:
author_form = AuthorForm(request.POST)
books_formset = BooksFormset(request.POST)
if author_form.is_valid() and books_formset.is_valid():
author = author_form.save()
new_books = books_formset.save(commit=False)
for new_book in new_books:
new_book.author = author
new_book.save()
# not actually needed with these models, but a good habit to include nonetheless
books_formset.save_m2m()
return redirect('some-success-view')
else:
author_form = AuthorForm()
books_formset = BooksFormset(queryset=Book.objects.none()) # or give a different initial queryset if you want some preselected choice
extra_context = {'author_form': author_form, 'books_formset': books_formset}
return render(request, 'some_template', extra_context)

内联表单集基本上为您完成作者实例和书籍实例之间的绑定(bind)。在内部,内联表单集使用基于您提供的父模型实例的查询集 - 我认为在 get 代码路径中传递 instance=None 并且如果作者form does not validate in the post 可以工作,但我从未测试过。

此外,我不会在这里处理“添加更多”行为 - 管理员从 Jquery 插件获取该行为,并且应该很容易将其复制到您自己的表单中。

关于django - 如何在 Django 中获得内联表单集的反向内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com