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.POSTrequest.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')])