Django - 使用 pk URL 重新定义表单 Select
Django - redefine Form Select using pk URL
我需要使用 URL 发送的 pk 设置输入 (select) 值。
在表格中使用__init__
,几乎得到答案,但是__init__
方法执行了两次并清除了我的值。
表格:
class CrearDelitoForm(forms.ModelForm):
class Meta:
model = Delito
exclude = ()
def __init__(self, numero_pk = None, *args, **kwargs):
super(CrearDelitoForm, self).__init__(*args, **kwargs)
self.fields["imputado"].queryset = Imputado.objects.filter(numero_id = numero_pk)
DelitoFormset = inlineformset_factory(
Expediente,
Delito,
form=CrearDelitoForm,
extra=1,
can_delete=True,
fields=('imputado', 'delito', 'categoria'),
}
)
观看次数:
class CrearDelito(CreateView):
model = Delito
form_class = CrearDelitoForm
template_name = 'crear_delito.html'
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['formset'] = DelitoFormset()
context['expedientes'] = Expediente.objects.filter(id = self.kwargs['pk'])
return context
def get_form_kwargs(self, **kwargs):
kwargs['numero_pk'] = self.kwargs['pk']
return kwargs
**
系统检查未发现任何问题(0 沉默)。
2020 年 6 月 8 日 - 11:33:57
Django 版本 2.2.12,使用设置 'red.settings'
在 http://127.0.0.1:8000/ 启动开发服务器
使用 CTRL-BREAK 退出服务器。
, ]>
**
我认为问题出在 context = super().get_context_data(**kwargs) 但不知道为什么。
一个CreateView
制作一个表格,你在form_class
中指定的表格。它还会将 request.POST
和 request.FILES
传递给表单,因此您 而不是 必须自己构建一个表单集,而让 CreateView
做那。
您需要将字典传递给 form_kwargs
到 formset 的 form_kwargs
,因此 get_form_kwargs
需要更改为:
class CrearDelito(CreateView):
model = Delito
form_class = <b>DelitoFormset</b>
template_name = 'crear_delito.html'
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['expedientes'] = Expediente.objects.filter(id=self.kwargs['pk'])
<b>context['formset'] = context['form']</b>
return context
def get_form_kwargs(self, **kwargs):
form_kwargs = super().get_form_kwargs(**kwargs)
<b>form_kwargs['form_kwargs'] = {'numero_pk': self.kwargs['pk']}</b>
<b>form_kwargs['instance'] = Expediente.objects.get(id=self.kwargs['pk'])</b>
return form_kwargs
def get_success_url(self):
return reverse('repositorio:crear_victima', args=[request.POST.get('numero_id')])
我需要使用 URL 发送的 pk 设置输入 (select) 值。
在表格中使用__init__
,几乎得到答案,但是__init__
方法执行了两次并清除了我的值。
表格:
class CrearDelitoForm(forms.ModelForm):
class Meta:
model = Delito
exclude = ()
def __init__(self, numero_pk = None, *args, **kwargs):
super(CrearDelitoForm, self).__init__(*args, **kwargs)
self.fields["imputado"].queryset = Imputado.objects.filter(numero_id = numero_pk)
DelitoFormset = inlineformset_factory(
Expediente,
Delito,
form=CrearDelitoForm,
extra=1,
can_delete=True,
fields=('imputado', 'delito', 'categoria'),
}
)
观看次数:
class CrearDelito(CreateView):
model = Delito
form_class = CrearDelitoForm
template_name = 'crear_delito.html'
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['formset'] = DelitoFormset()
context['expedientes'] = Expediente.objects.filter(id = self.kwargs['pk'])
return context
def get_form_kwargs(self, **kwargs):
kwargs['numero_pk'] = self.kwargs['pk']
return kwargs
** 系统检查未发现任何问题(0 沉默)。 2020 年 6 月 8 日 - 11:33:57 Django 版本 2.2.12,使用设置 'red.settings' 在 http://127.0.0.1:8000/ 启动开发服务器 使用 CTRL-BREAK 退出服务器。 , ]> **
我认为问题出在 context = super().get_context_data(**kwargs) 但不知道为什么。
一个CreateView
制作一个表格,你在form_class
中指定的表格。它还会将 request.POST
和 request.FILES
传递给表单,因此您 而不是 必须自己构建一个表单集,而让 CreateView
做那。
您需要将字典传递给 form_kwargs
到 formset 的 form_kwargs
,因此 get_form_kwargs
需要更改为:
class CrearDelito(CreateView):
model = Delito
form_class = <b>DelitoFormset</b>
template_name = 'crear_delito.html'
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
context['expedientes'] = Expediente.objects.filter(id=self.kwargs['pk'])
<b>context['formset'] = context['form']</b>
return context
def get_form_kwargs(self, **kwargs):
form_kwargs = super().get_form_kwargs(**kwargs)
<b>form_kwargs['form_kwargs'] = {'numero_pk': self.kwargs['pk']}</b>
<b>form_kwargs['instance'] = Expediente.objects.get(id=self.kwargs['pk'])</b>
return form_kwargs
def get_success_url(self):
return reverse('repositorio:crear_victima', args=[request.POST.get('numero_id')])