ger*_*ijk 2 django django-forms
请参阅下面Django 文档中的此示例:
Run Code Online (Sandbox Code Playgroud)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)如果您想创建一个表单集,允许您编辑属于特定作者的书籍,您可以这样做:
Run Code Online (Sandbox Code Playgroud)>>> from django.forms.models import inlineformset_factory >>> BookFormSet = inlineformset_factory(Author, Book) >>> author = Author.objects.get(name=u'Mike Royko') >>> formset = BookFormSet(instance=author)
这是与 Authors to Books 的一对多关系,并提供了一种为单个作者编辑书籍的简单方法。
现在我想做相反的事情:一个用于编辑/创建作者的表单,其中包含要编辑/创建的内联书籍表单集。我怎么做?我真的更喜欢一种使用 ModelForms 来做到这一点的方法,而无需创建所涉及的模型之一的实例。
例如:
[________][________][________][________][save]注意:此时我需要没有任何 Authors 实例。
我可能在这里遗漏了一些简单的东西,而且我在此处的文档上花了太多时间。欢迎提供一些帮助!
我会在同一视图中使用ModelFormforAuthor和ModelFormsetfor来做到这一点Book。像这样的东西:
# 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)
Run Code Online (Sandbox Code Playgroud)
内联表单集基本上为您完成作者实例和书籍实例之间的绑定。在内部,在线表单集使用基于你给它的父模型的实例的查询集-我想传递instance=None的get代码路径,如果笔者表格没有验证的post工作,但我从来没有测试过。
另外,我不是在这里处理“添加更多”行为——管理员从 Jquery 插件中获取该行为,并且应该很容易复制到您自己的表单上。
| 归档时间: |
|
| 查看次数: |
1526 次 |
| 最近记录: |