python - 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 的适当机制的方法变体——我只是无法正确实现它(或在正确的类对象中得到它)。
解决方案
尝试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)
推荐阅读
- python - Python上根据特定条件删除多列CSV文件
- cplex - 如何声明具有 IloNumArray 类型的动态数组?
- r - 在 R 中转换纵向数据以进行事件时间分析
- node.js - 在共享 CPanel 服务器上使用 Socket IO 运行 NodeJS 应用程序
- java - 可以修改sql中的唯一约束吗?
- python-3.x - 附加模式下的 open() 未按预期运行
- java - 创建@OneToOne 时抛出错误无法检索结果集
- java - XML 模式验证:找不到元素(根)的声明
- r - 根据条件合并 2 个长格式数据集
- c++ - 这是在 CPP 中初始化向量的正确方法吗?