Функция инициализации Django определяет выбор полей на основе URL-адреса pk

У меня есть рабочая форма.

Моя цель - определить выбор поля из другой модели на основе 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')

введите здесь описание изображения


person Daniel Azcar    schedule 08.06.2020    source источник


Ответы (1)


Я публикую решение, данное в другом вопросе, для:

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 here
person Daniel Azcar    schedule 09.06.2020