所有
我正在尝试使用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)
在我的代码中的其他地方,我试图显示一个Model_form以及一个Author_formset。但是,当需要初始化该formset时,我不知道该怎么做。此时我知道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 :(得分:1)
你走在正确的轨道上。
book.authors
是“本书中有m2m的作者”的查询集。因此,传递给formset init是完全有效的。
formset = AuthorFormset(queryset=m2m_field.all())
答案 1 :(得分: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())
这看起来有点难看,但确实有效。