2

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)

特定の著者の書籍を編集できるフォームセットを作成したい場合は、次のようにします。

>>> 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 との 1 対多の関係であり、1 人の著者の本を簡単に編集する方法を提供します。

今、私は反対のことをしたい: 編集/作成する書籍のインライン フォームセットを使用して著者を編集/作成するフォーム。それ、どうやったら出来るの?関連するモデルの 1 つのインスタンスを作成する必要なく、 ModelForms を使用してこれを行う方法が本当に望ましいと思います。

例えば:

作成者フォームを追加

  • 著者名:[________]
  • 書籍:
    • 題名:[________]
    • 題名:[________]
    • 題名:[________]
    • (さらに追加)
  • [save]

注: この時点では Authors のインスタンスなしでこれが必要です。

ここで単純なことを見逃している可能性があり、ここのドキュメントに少し時間を費やしすぎました。ちょっとしたお手伝い大歓迎!

4

1 に答える 1

5

同じビューでModelFormforAuthorModelFormsetforを使用してこれを行います。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)

インライン フォームセットは基本的に、author インスタンスと books インスタンスの間のバインディングを行います。内部的には、インライン フォームセットは、指定した親モデルのインスタンスに基づいてクエリセットを使用します。コード パスを渡しinstance=Noneget作成者フォームが検証されない場合は機能すると思いますpostが、テストしたことはありません。

また、ここでは「さらに追加」の動作には取り組んでいません。管理者は Jquery プラグインからその動作を取得するため、独自のフォームに簡単にコピーできるはずです。

于 2013-07-07T21:17:25.527 に答える