2012-01-27 108 views
0

全部,使用manytomanyfield初始化modelformset

我正在嘗試初始化一個帶有許多字段的modelformset。有一個問題是,我不能預先知道多人組合的名稱(也不是它所綁定的組)。

這裏是我的模型和形式:

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字段(「作者」),父模型實例(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()) 

但我不能這樣做,直接,因爲我被困在一些通用的代碼可能被要求任何 model/form/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 = AuthorFormset()'也顯示出莎士比亞的細節,而不是像我預期的那樣空洞的形式。 – trubliphone 2012-01-28 05:20:58