0

全て、

manytomanyfieldを使用してmodelformsetを初期化しようとしています。キャッチは、manytomanyfieldの名前(またはバインドされているクラス)が事前にわからないことです。

これが私のモデルとフォームです:

class Book_model(models.Model):
    title = models.CharField(max_length=BIG_STRING)
    authors = models.ManyToManyField("Author_model",)

class Author_model(models.Model):
    name = models.CharField(max_length=BIG_STRING)

class Book_form(ModelForm):
    class Meta:
        model = Book_model

class Author_form(ModelForm:
    class Meta:
        model = Author_model

Author_formset = modelformset_factory(Author_model,form=Author_form)

そして、私のコードの他の場所で、Author_formsetと一緒にModel_formを表示しようとしています。ただし、そのフォームセットを初期化するときは、どうすればよいかわかりません。その時点で、m2mフィールド( "authors")、親モデルインスタンス(Book_model)、親フォームインスタンス(Book_form)、およびフォームセットクラス(Author_formset)の名前がわかります。私は次のようなことをする必要があると思います:

m2m_field = getattr(book,"authors")
qset = field.filter(<only authors for which there is a m2m relationship from this book>)
formset = Author_formset(queryset=qset)

しかし、私はフィルターに入れる正しい用語を知りません。

助言がありますか?

4

2 に答える 2

1

あなたは正しい方向に進んでいます。

book.authors 「この本からm2mがある著者」のクエリセットですしたがって、これはフォームセットのinitに渡すのに完全に有効です。

formset = AuthorFormset(queryset=m2m_field.all())
于 2012-01-27T16:29:28.157 に答える
0

私はこれを解決した と思います。

理論的には、ダニエルが示唆しているように、これは物事を行う正しい方法です。

formset = Author_formset(queryset=book.authors.all())

しかし、それを直接行うことはできません。これは、任意のモデル/フォーム/フォームセットに対して呼び出される可能性のある一般的なコードに閉じ込められているためです。だから私は代わりにこれをすることを余儀なくされています:

 # these 4 lines are just for clarity's sake
 # I don't actually know what these map to in my code
 MyModelClass = Book_model
 MyFormClass = Book_form
 MyFormSetClass = Author_formset
 fieldName = "authors"

 def DoStuff(model_id=None):
   if (model_id):
     model = MyModelClass.objects.get(pk=model_id)
   else:
     model = MyModelClass()

   form = MyFormClass(instance=model)

   if model.pk:
     m2mModels = getattr(model,fieldName)
     formset = MyFormSetClass(queryset = m2mModels.all())
   else:
     m2mModelClass = MyFormSetClass.form.Meta.model
     formset = MyFormSetClass(queryset = m2mModelClass.objects.none())

これは少し醜いようですが、機能します。

于 2012-01-28T07:06:52.433 に答える