Python Django Queryset在ModelForm中使用“pk”

Python Django Queryset在ModelForm中使用“pk”,python,django,python-3.x,django-forms,Python,Django,Python 3.x,Django Forms,我试着遵循问答,这正是我想要做的,但是用pk而不是固定键。我的文件 views.py class JuryCreate(CreateView): model = Jury form_class = JuryCreateForm def form_valid(self, form): form.instance.customer_id = self.kwargs['pk'] form.instance.court_year_id = sel

我试着遵循问答,这正是我想要做的,但是用pk而不是固定键。我的文件

views.py

class JuryCreate(CreateView):
    model = Jury
    form_class = JuryCreateForm

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year_id = self.kwargs['yr']
        return super().form_valid(form)
forms.py

class JuryCreateForm(ModelForm):

    class Meta:
        model = Jury
        fields = [
            'parent_jury',
            #Other Fields
            ]

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['parent_jury'].queryset = Jury.objects.filter(
            customer_id = self.kwargs['pk']).filter(
            court_year_id = self.kwargs['yr'])
如果我直接从视图转到模板,我就能够访问queryset,它提供了一个queryset对象。但是如果我浏览ModelForm,它会抛出一个AttributeError:“JuryCreateForm”对象没有属性“kwargs”。基本上,我认为请求没有传递到ModelForm,因此它无法访问kwargs。如何将主键放入ModelForm以填充字段

我还尝试了get_form_kwargs方法的各种变体,我认为这是将它们传递到ModelForm的合适机制-我只是无法使其正确实现或在正确的类对象中获得它。

尝试像这样覆盖view的get_form_kwargs方法:

class JuryCreate(CreateView):
    model = Jury
    form_class = JuryCreateForm

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year_id = self.kwargs['yr']
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['pk'] = self.kwargs['pk']
        kwargs['yr'] = self.kwargs['yr']
        return kwargs
在表单init中,使用kwargs['pk']或kwargs.pop'pk'访问pk值:

尝试覆盖视图的get_form_kwargs方法,如下所示:

class JuryCreate(CreateView):
    model = Jury
    form_class = JuryCreateForm

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year_id = self.kwargs['yr']
        return super().form_valid(form)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs['pk'] = self.kwargs['pk']
        kwargs['yr'] = self.kwargs['yr']
        return kwargs
在表单init中,使用kwargs['pk']或kwargs.pop'pk'访问pk值:

让模板工作起来 作为@neverwanner正确答案的最后一个后续步骤——一旦Queryset在ModelForm中初始化,它将显示在模板中,如下所示或至少是我找到的最快方式:

jury-update.html

<select>
    {% for item in form.parent_jury.field.queryset %}
        <option value="{{item}}">{{ item }}</option>
    {% endfor %}
</select>
让模板工作起来 作为@neverwanner正确答案的最后一个后续步骤——一旦Queryset在ModelForm中初始化,它将显示在模板中,如下所示或至少是我找到的最快方式:

jury-update.html

<select>
    {% for item in form.parent_jury.field.queryset %}
        <option value="{{item}}">{{ item }}</option>
    {% endfor %}
</select>

这会在**之后抛出:ModelFormMetaclass对象参数必须是一个映射,而不是NoneType-但我觉得这是在正确的轨道上-我只是无法让它正确通过。@BillArmstrong抱歉,我在get\u form\u kwargs中错过了return kwargs。检查更新的答案。砰。。。是的-我缺少的是.pop,然后删除了ModelForm类中的.self。谢谢。在**之后抛出:ModelFormMetaclass对象参数必须是一个映射,而不是NoneType-但我觉得这是正确的-我只是不能让它正确通过。@BillArmstrong抱歉,我错过了get_form_kwargs中的return kwargs。检查更新的答案。砰。。。是的-我缺少的是.pop,然后删除了ModelForm类中的.self。谢谢