Django,修改 ModelForm 的查询集时传递信息

bco*_*lan 1 python django django-forms

数据库:文档有很多节,节有很多评论

在每个文档页面上,都有一个注释表单,可让您选择该部分(使用 ModelChoiceField)。问题是 ModelChoiceField 将包含所有文档的所有部分。

因此,为了限制它们,我这样做:

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
Run Code Online (Sandbox Code Playgroud)

我的观点是:

form = CommentForm()
Run Code Online (Sandbox Code Playgroud)

如何向 CommentForm 传递文档 ID?

编辑:在我看来尝试过:

d = Document.objects.get(id=id)
c = Comment(d)
form = CommentForm(c)
Run Code Online (Sandbox Code Playgroud)

但 CommentForm 中的 document_id 仍然为 None

Tim*_*ony 5

您可以在初始化表单时传递文档 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)
Run Code Online (Sandbox Code Playgroud)

并在视图中

def my_view(request):
    ...
    doc = Document.objects(...)
    form = CommentForm(doc_id = doc.id)
Run Code Online (Sandbox Code Playgroud)

编辑

我编辑了视图的第二行,我认为它涉及您的评论?(make doc.id) 关键字争论

  • 只是我的额外 2 美分...我认为像这样更改查询集会更好一点: `self.fields['section'].queryset = self.fields['section'].queryset.filter(document__id=doc_id) ` (2认同)