Инициализация набора запросов для выпадающего поля в ModelForm

У меня проблема с фильтрацией набора запросов по списку идентификаторов объектов. При отправке формы выдается ошибка [{'item': ['Select a valid choice. That choice is not one of the available choices.']}]. При передаче req (список целых чисел) в отфильтрованный кверисет, Django не принимает req как набор допустимых вариантов/объектов и не сохраняет форму. Однако, при передаче предварительно заданного списка, содержащего те же значения, что и req, Django принимает и сохраняет форму. Я пробовал печатать, если req равен тому же списку предустановок, и он возвращает True.

views.py

class TransferAddView(LoginRequiredMixin, generic.CreateView):
...
    def form_valid(self, form, **kwargs):
        ctx = self.get_context_data()
        inlines = ctx['inlines']
        form.instance.requisition = ctx['req']
        if inlines.is_valid() and form.is_valid():
            tran = form.save()
            inlines.instance = tran
            inlines.save()
        return super(TransferAddView, self).form_valid(form)
    
    

    def get_context_data(self, **kwargs):
        ctx=super(TransferAddView,self).get_context_data(**kwargs)
        ctx['req'] = MaterialRequisition.objects.get(pk=self.kwargs['req'])
        req = list(MaterialRequisitionItems.objects.filter(requisition=ctx['req']).values_list('item', flat=True))
        ctx['item'] = Item.objects.filter(item__in=req)
        if self.request.method == 'POST':
            ctx['form']=TransferModelForm(self.request.POST)
            ctx['inlines']=TransferInlineFormSet(self.request.POST)
            ctx['form'].fields['transferStatus'].initial = 0
        else:
            ctx['form']=TransferModelForm()
            ctx['form'].fields['transferStatus'].initial = 0
            ctx['inlines']=TransferInlineFormSet(form_kwargs={'req':ctx['req'].pk})
        return ctx

forms.py

class TransferItemsModelForm(forms.ModelForm):
...
    def __init__(self, *args, **kwargs):
        req = kwargs.pop('req', None)
        super(TransferItemsModelForm, self).__init__(*args, **kwargs)
        ...
        req = list(MaterialRequisitionItems.objects.filter(requisition=req).values_list('item', flat=True))
        self.fields['item'].queryset = Item.objects.filter(item__in=req)

Возможно, я понял, как правильно это сделать. Я изменил req на reqs, затем я передал reqs в набор форм в методе POST и немного подправил его. Теперь get_context_data в представлениях выглядит следующим образом:

def get_context_data(self, **kwargs):
        ctx=super(TransferAddView,self).get_context_data(**kwargs)
        ctx['req'] = MaterialRequisition.objects.get(pk=self.kwargs['req'])
        req = list(MaterialRequisitionItems.objects.filter(requisition=ctx['req']).values_list('item', flat=True))
        ctx['item'] = Item.objects.filter(item__in=req)
        if self.request.method == 'POST':
            ctx['form']=TransferModelForm(self.request.POST)
            ctx['inlines']=TransferInlineFormSet(self.request.POST, form_kwargs={'reqs': list(MaterialRequisitionItems.objects.filter(requisition=ctx['req'].pk).values_list('item', flat=True))})
            ctx['form'].fields['transferStatus'].initial = 0
        else:
            ctx['form']=TransferModelForm()
            ctx['form'].fields['transferStatus'].initial = 0
            ctx['inlines']=TransferInlineFormSet(form_kwargs={'reqs': list(MaterialRequisitionItems.objects.filter(requisition=ctx['req'].pk).values_list('item', flat=True))})
        return ctx
Вернуться на верх