0

全部,

我正在尝试使用多字段初始化模型表单集。一个问题是我事先不知道 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)

在我的代码的其他地方,我试图显示一个 Model_form 和一个 Author_formset。但是,当需要初始化该表单集时,我不确定该怎么做。那时我知道 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 的作者”的查询集。因此,传递给 formset 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 回答