我正在尝试关注this SO Q&A 这正是我想要做的,但是使用 pk
而不是固定 key 。我的文件...
View .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 的适当机制 - 我只是无法让它正确实现(或使其正确)类对象)。
最佳答案
尝试重写 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
值:
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 - ModelForm 中的 Django 查询集使用 'pk',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50691066/