我需要使用URL发送的pk设置输入(选择)值。
使用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:57Django 2.2.12版,使用设置“ red.settings”在http://127.0.0.1:8000/启动开发服务器使用CTRL-BREAK退出服务器。,
**我认为问题出在context = super()。get_context_data(** kwargs)
,但不知道为什么。A CreateView
创建一个表格,即您在form_class
中指定的表格。它将进一步将request.POST
和request.FILES
传递给表单,因此您不必自己构造一个表单集,但让CreateView
这样做:
class CrearDelito(CreateView):
model = Delito
form_class = DelitoFormset
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'])
context['formset'] = context['form']
return context
def get_form_kwargs(self, **kwargs):
form_kwargs = super().get_form_kwargs(**kwargs)
form_kwargs['form_kwargs'] = {'numero_pk': self.kwargs['pk']}
return kwargs