Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django,在修改ModelForm的queryset时传递信息_Python_Django_Django Forms - Fatal编程技术网

Python Django,在修改ModelForm的queryset时传递信息

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)

数据库: 文件有很多章节,章节有很多注释

在每个文档页面上,都有一个注释表单,允许您选择部分(使用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
我的观点是:

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是关键字参数,因此无论将其放在何处,位置参数都不应受到影响。嗯,是的,似乎是另一个问题:/