首页 > 解决方案 > ModelForm 中的 Django Queryset 使用“pk”

问题描述

我正在尝试遵循这个SO Q&A,这正是我想要做的,但使用的是 apk而不是固定的密钥。我的文件...

视图.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)

表格.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'])

如果我直接从模板转到view模板,我就可以访问查询集(它提供了一个查询集对象)。但是如果我通过 ModelForm 它会抛出一个AttributeError: 'JuryCreateForm' object has no attribute 'kwargs'. 基本上,我相信请求没有传递给 ModelForm,因此它无法访问 kwargs。如何将主键放入 ModelForm 以填充字段?

我还尝试了get_form_kwargs一些我认为是将这些传递给 ModelForm 的适当机制的方法变体——我只是无法正确实现它(或在正确的类对象中得到它)。

标签: pythondjangopython-3.xdjango-forms

解决方案


尝试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值:

def __init__(self, *args, **kwargs):
    pk = kwargs.pop('pk')
    yr = kwargs.pop('yr') 
    super().__init__(*args, **kwargs)
    self.fields['parent_jury'].queryset = Jury.objects.filter(
        customer_id = pk).filter(
        court_year_id = yr)

推荐阅读