@Demian1

Как переписать FBV в CBV?

Только начал изучать django и во всех книгах, и в доках примеры представления в основном пишут функциями. Решил изучить классы и переписываю прошлый "проект"
Суть вопроса: не могу переписать форму сортировки товара
def product_list(request):
    products = Product.objects.filter(available=True)
    form = ArticlesFilterForm(request.GET)
    if form.is_valid():
        if form.cleaned_data['ordering']:
            products = products.order_by(form.cleaned_data['ordering'])
                                 
    return render(request, 'shop/product/list.html',  {'products': products, 
                        'form': form})


#Получается что-то типа такого
class ProductsView(ListView):
    model = Product
    context_object_name = 'product_list'
    template_name = 'shop/product_list.html'
    form = ArticlesFilterForm

    def get_queryset(self):
        form = self.form(self.request.GET)
        if form.is_valid():
            if form.cleaned_data['ordering']:
                product_list = product_list.prder_by(form.cleaned_data['ordering'])

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['product_list'] = Product.objects.all()
        context['form'] = ArticlesFilterForm
        return context


Когда нажимаю сортировать выдает ошибку ( local variable 'product_list' referenced before assignment )
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
tema_sun
@tema_sun
Я бы делал это в get_ordering, а не в get_qureyset (https://docs.djangoproject.com/en/3.0/ref/class-ba...

Но отвечая именно на ваш вопрос, у вас не определен queryset "product_list" который вы пытаетесь отсортировать.

Не проверял, но думаю исправить это можно так:
def get_queryset(self):
        qs = super().get_queryset()
        form = self.form(self.request.GET)
        if form.is_valid():
            if form.cleaned_data['ordering']:
                qs= qs.order_by(form.cleaned_data['ordering'])
        return qs
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Demian1 Автор вопроса
Спасибо за ответ, но я только что решил проблему, нужно было в условии вместо переменно product_list, просто вернуть объект
if form.cleaned_data['ordering']:
                return Product.objects.order_by(form.cleaned_data['ordering'])
            return Product.objects.all()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы