У меня есть рабочая форма.
Моя цель - определить выбор поля из другой модели на основе pk, отправленного по URL-адресу. Это почти работает, но метод init выполняется дважды и очищает kwargs.
Модель:
class Delito(models.Model):
numero = models.ForeignKey(Expediente, on_delete=models.CASCADE, blank = False)
delito = models.ForeignKey(CatalogoDelitos, on_delete=models.CASCADE, blank = False)
imputado = models.ForeignKey(Imputado, on_delete=models.CASCADE, blank = False)
categoria = models.CharField('Categoria', max_length = 20, blank = False, choices = CATDEL_CHOICES)
Мой URL:
path('crear_delito/<int:pk>', login_required(CrearDelito.as_view()), name ='crear_delito'),
Формы.py:
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'),
}
)
Просмотры.py:
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
Если я печатаю набор запросов, он работает в первый раз, но передается дважды, очищая значение «numero_pk»:
System check identified no issues (0 silenced).
June 08, 2020 - 11:33:57
Django version 2.2.12, using settings 'red.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
<QuerySet [<Imputado: Martín Ric>, <Imputado: Marcos Gomez>]>
<QuerySet []>
Если я помещаю значение в виде строки, оно работает нормально, например:
def __init__(self, numero_pk = None, *args, **kwargs):
super(CrearDelitoForm, self).__init__(*args, **kwargs)
self.fields["imputado"].queryset = Imputado.objects.filter(numero_id = '6')