Python Django Queryset在ModelForm中使用“pk”
我试着遵循问答,这正是我想要做的,但是用pk而不是固定键。我的文件 views.pyPython 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
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。谢谢