Python Django,在修改ModelForm的queryset时传递信息
数据库: 文件有很多章节,章节有很多注释 在每个文档页面上,都有一个注释表单,允许您选择部分(使用ModelChoiceField)。问题是ModelChoiceField将包含所有文档的所有部分 为了限制它们,我做了以下几点:Python Django,在修改ModelForm的queryset时传递信息,python,django,django-forms,Python,Django,Django Forms,数据库: 文件有很多章节,章节有很多注释 在每个文档页面上,都有一个注释表单,允许您选择部分(使用ModelChoiceField)。问题是ModelChoiceField将包含所有文档的所有部分 为了限制它们,我做了以下几点: class CommentForm(ModelForm): def __init__(self, *args, **kwargs): super(CommentForm, self).__init__(*args, **kwargs)
class CommentForm(ModelForm):
def __init__(self, *args, **kwargs):
super(CommentForm, self).__init__(*args, **kwargs)
if self.instance:
logger.debug(self.instance.document_id) # Prints "None"
self.fields['section'].queryset = Section.objects.filter(document=self.instance.document)
# ^^^ Throws DoesNotExist as self.instance.document is None
我的观点是:
form = CommentForm()
如何传递文档id
编辑:在我的视图中尝试:
d = Document.objects.get(id=id)
c = Comment(d)
form = CommentForm(c)
但是CommentForm中仍然没有文档id您可以在初始化表单时传递文档id:
class CommentForm(ModelForm):
def __init__(self, doc_id=None, *args, **kwargs):
if doc_id:
self.fields['section'].queryset = Section.objects.filter(document__id=doc_id)
在我看来
def my_view(request):
...
doc = Document.objects(...)
form = CommentForm(doc_id = doc.id)
编辑
我编辑了视图的第二行,我想这与你的评论有关?(make doc.id)关键字参数初始化表单时可以传递文档id:
class CommentForm(ModelForm):
def __init__(self, doc_id=None, *args, **kwargs):
if doc_id:
self.fields['section'].queryset = Section.objects.filter(document__id=doc_id)
在我看来
def my_view(request):
...
doc = Document.objects(...)
form = CommentForm(doc_id = doc.id)
编辑
我编辑了视图的第二行,我想这与你的评论有关?(make doc.id)关键字参数后者将用于编辑现有对象,除非我已经离开?现在踢我自己,太明显了!谢谢你,只是我的额外2美分。。。我认为这样更改queryset会更好一些:
self.fields['section'].queryset=self.fields['section'].queryset.filter(document\u id=doc\u id)
@Beres谢谢,效果很好@pastylegs-此方法实际上遇到了问题,因为当Django在使用.save()时调用CommentForm时,*args将丢失其第一个参数。我知道这是有黑客的,但肯定这在Django是一个非常常见的任务,不需要黑客…你确定吗*arg是位置参数,而doc_id=None是关键字参数,所以不管放在哪里,位置参数都不应该受到影响。嗯,是的,似乎是另一个问题:/后者将用于编辑现有对象,除非我离开?现在踢我自己,太明显了!谢谢你,只是我的额外2美分。。。我认为这样更改queryset会更好一些:self.fields['section'].queryset=self.fields['section'].queryset.filter(document\u id=doc\u id)
@Beres谢谢,效果很好@pastylegs-此方法实际上遇到了问题,因为当Django在使用.save()时调用CommentForm时,*args将丢失其第一个参数。我知道这是有黑客的,但肯定这在Django是一个非常常见的任务,不需要黑客…你确定吗*arg是位置参数,而doc_id=None是关键字参数,因此无论将其放在何处,位置参数都不应受到影响。嗯,是的,似乎是另一个问题:/