2012-01-27 6 views
0

すべて、modelformsetをmanytomanyfieldで初期化する

モデルフォームをmanytomanyfieldで初期化しようとしています。キャッチは、私が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)、およびformsetクラス(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) 

しかし:私はちょうどこのような何かをする必要があることを前提としています。

提案がありますか?

答えて

0

私はこれを解決したと思います。理論的には

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

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

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

# 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()) 

これは少し醜いようだが、それは動作します。

1

あなたは正しい道を歩いています。

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

formset = AuthorFormset(queryset=m2m_field.all()) 
+0

ありがとうございました。しかし、物事はうまくいっていません。 「シェイクスピア」の著者がいる本を偽りましょう。私の見解が_that_本を使用している場合、 'formset = AuthorFormset(queryset = book.authors.all())'はうまく動作しているようです(シェイクスピアの詳細が含まれたフォームセットを表示します)。しかし、私の見解が新しいモデルを使用している場合、formsetは空でなければなりません。しかし、 'formset = AuthorFormset()'は、シェイクスピアの詳細を含むフォームを表示するだけでなく、私が期待したような空のフォームではありません。 – trubliphone

関連する問題