Django : "сломать" представление на основе класса с промежуточным "return render" не получится

Я использую CB ListView для отображения объектов. Я хочу добавить переменную сессии, основанную на PK другой модели.

views.py

class ProduitListView(LoginRequiredMixin, ListView):

    model = Produit
    context_object_name = "produits"
    paginate_by = 10
    template_name = 'products/produits.html'
    ordering = ['-mageid', ]

    def get_context_data(self, *args, **kwargs):
        context = super(ProduitListView, self).get_context_data(
            *args, **kwargs)

        # used for incoming products (sourcing cf URLS)
        supplier_pk = self.kwargs.get('pk', None)
        if supplier_pk:
            set_incoming_supplier(self.request, supplier_pk)

        context['avail_warehouses'] = Warehouse.objects.all()
        context['js_warehouses'] = serialize(
            'json', Warehouse.objects.all(), fields=('code', 'id', ))
        context['title'] = 'Produits'
        return context

set_incoming_supplier (в другом APP)

@login_required
def set_incoming_supplier(request, pk):
    supplier = Supplier.objects.filter(pk=pk).first()
    supp = SupplierSerializer(instance=supplier).data
    rs = request.session
    if 'income' in rs:
        if 'cur_supplier' in rs['income']:
            prev_supplier = rs['income']['cur_supplier']
            if supp != prev_supplier:
                return render(request, 'sourcing/alert_supplier_change.html',
                              {'prev_supplier': prev_supplier, 'cur_supplier': rs['income']['cur_supplier']})
    rs['income'] = {'cur_supplier': supp}

Я думал, что return render(request, 'sourcing/alert_supplier_change... может "сломать" мой ListView и отобразить мою alert page, но этого не происходит. ListView, кажется, продолжает работать и, наконец, отображает мою ProduitListView страницу.

Почему это не работает?

Наконец-то нашел решение, которое заключается в использовании метода get() в моем CBV. В нем я оцениваю своего поставщика с помощью set_incoming_supplier(), который возвращает context или None. Согласно этой оценке, я render либо обычный шаблон, либо мой шаблон оповещения.

ProduitListView(LoginRequiredMixin, ListView):

class ProduitListView(LoginRequiredMixin, ListView):

    model = Produit
    context_object_name = "produits"
    paginate_by = 10
    template_name = 'products/produits.html'
    ordering = ['-mageid', ]

    def get_context_data(self, *args, **kwargs):
        context = super(ProduitListView, self).get_context_data(
            *args, **kwargs)
        context['avail_warehouses'] = Warehouse.objects.all()
        context['js_warehouses'] = serialize(
            'json', Warehouse.objects.all(), fields=('code', 'id', ))
        context['title'] = 'Produits'
        return context

    def get(self, request, *args, **kwargs):
        supplier_pk = self.kwargs.get('pk', None)
        if supplier_pk:
            context = set_incoming_supplier(self.request, supplier_pk)
            if context:
                return render(request, 'sourcing/alert_supplier_change.html', context)
        return super().get(request, *args, **kwargs)

set_incoming_supplier()

def set_incoming_supplier(request, pk):
    supplier = Supplier.objects.filter(pk=pk).first()
    supp = SupplierSerializer(instance=supplier).data
    rs = request.session
    if 'income' in rs:
        if 'cur_supplier' in rs['income']:
            prev_supplier = rs['income']['cur_supplier']
            if supp != prev_supplier:
                return {'prev_supplier': prev_supplier, 'cur_supplier': supp}
    rs['income'] = {'cur_supplier': supp}

Возможно, не самый лучший способ, но он хорошо работает.

Вернуться на верх