Как отфильтровать ModelChoiceField для вложенного набора InlineFormset? - PullRequest
0 голосов
/ 27 сентября 2019

В моем forms.py я хочу, чтобы referenceBFlow с полем выбора модели имел только связанный BasicFlow.В настоящее время все BasicFlow возвращаются, когда я использовал queryset = BasicFlow.objects.all () .Я хотел бы знать, как динамически фильтровать запрос.Например: если у меня есть профиль (prof1) и basicGroup (bg1), basicflow (bf1, bf2, bf3 ...), AltGroup (ag1).Теперь в моем шаблоне, если я нажму на раскрывающийся список для ссылки BFlow для ag1, он должен иметь базовый поток (bf1, bf2, bf3 ...).Если другой профиль, профиль (prof2) и basicGroup (bg2), basicflow (bf4, bf5, bf6 ...), AltGroup (ag2), то referenceBFlow для ag2 должен иметь basicflow (bf4, bf5, bf6 ...).

models.py -

class Project(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
    ...

class Profile(models.Model):
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    ...

class B_FlowGroup(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True, blank=True)

class BasicFlow(models.Model):
    basicflGroup = models.ForeignKey(B_FlowGroup, on_delete=models.CASCADE, null=True, blank=True)
    ...

class A_FlowGroup(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True, blank=True)
    referenceBFlow = models.ForeignKey('BasicFlow', on_delete=models.CASCADE, null=True, blank=True)

class A_Flow(models.Model):
    altflGroup = models.ForeignKey(A_FlowGroup, on_delete=models.CASCADE, null=True, blank=True)
    ...

forms.py - в этом .py у меня есть вложенные и обычные inlineformsets

class B_FlowGroupForm(ModelForm):
    class meta:
        model = B_FlowGroup

class AltFlowGroupForm(ModelForm):
    class meta:
        model = AltFlowGroup
    referenceBFlow= forms.ModelChoiceField(widget=forms.Select,
                                           queryset=BasicFlow.objects.all())

class BasicFlow(ModelForm):
    class meta:
        model = BasicFlow

BasicFlowFormSet = inlineformset_factory(B_FlowGroup, BasicFlow, form=BasicFlowForm, extra=1)


class BaseB_GroupFormset(BaseInlineFormSet):
    def add_fields(self, form, index):
        super(BaseB_GroupFormset, self).add_fields(form, index)
        # save the formset in the 'nested' property
        form.nested = BasicFlowFormSet(instance=form.instance,
                                       data=form.data if form.is_bound else None,
                                       files=form.files if form.is_bound else None,
                                       prefix='basicFlow')

B_GroupInlineFormSet = inlineformset_factory(Profile, B_FlowGroup, form=B_FlowGroupForm, exclude=(),
                                                formset=BaseB_GroupFormset, extra=1, can_delete=False)


A_GroupInlineFormSet = inlineformset_factory(Profile, A_FlowGroup, form=A_FlowGroupForm, exclude=(),
                                                formset=BaseA_GroupFormset, extra=1, can_delete=False)

views.py - в этом .pyЯ создал вид обновления с профилем, являющимся основной моделью, а затем создал экземпляры B_GroupInlineFormSet и A_GroupInlineFormSet.Теперь, когда шаблон перерисован, я хочу, чтобы поле referenceBFlow modelchoice в A_GroupInlineFormSet отображало только базовые потоки, связанные с B_GroupInlineFormSet.

class ModelUCUpdateView(UpdateView):
    model = Profile
    form_class = ProfileForm

    def get_object(self):
       ...

    def get_success_url(self):
        ....
    def get_context_data(self, **kwargs):
        context = super(ModelUCUpdateView, self).get_context_data(**kwargs)
        if self.request.POST:
            context['form'] = ProfileForm(self.request.POST, instance=self.object)
            context['basicflowgroup_form'] = B_GroupInlineFormSet(self.request.POST, self.request.FILES, instance=self.object, prefix='modelbasicflowgroup')
            context['alflowgroup_form'] = A_GroupInlineFormSet(self.request.POST, self.request.FILES,instance=self.object, prefix='altflowgroup')

        else:
            ccontext['form'] = ProfileForm( instance=self.object)
            context['basicflowgroup_form'] = B_GroupInlineFormSet(self.request.FILES, instance=self.object, prefix='modelbasicflowgroup')
            context['alflowgroup_form'] = A_GroupInlineFormSet(self.request.FILES,instance=self.object, prefix='altflowgroup')
        return context

#other methods

В настоящее время я получаю все базовые потоки вместо тех, которыесвязаны с определенной B_FlowGroup.Основываясь на моем коде, я хотел бы знать, как динамически фильтровать поле выбора модели на основе базовых потоков, связанных с B_FlowGroup.

...