Django视图。我如何才能将此代码从基于函数的更改为基于类的

时间:2018-07-21 15:24:18

标签: django python-3.x django-models django-views django-class-based-views

我是django的新手,正在使用基于函数的视图来做大多数员工。现在,我需要将部分代码更改为基于类,并且已经堆叠了2天,因为找不到有关使用类实现类别的任何信息

所以我当前在views.py中的代码:

    from django.shortcuts import render, get_object_or_404
    from .models import Category, Product


def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True)
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = Product.objects.filter(category=category)

    context = {
        'category': category,
        'categories': categories,
        'products': products
    }
    return render(request, 'shop/product/list.html', context)

这是我与类别相关的模型的一部分

class Category(models.Model):
title = models.CharField(max_length=150, db_index=True)
slug = models.SlugField(blank=True, unique=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

class Meta:
    ordering = ('title',)
    verbose_name = 'категория'
    verbose_name_plural = 'категории'

def __str__(self):
    return self.title

class Product(models.Model):
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
    title       = models.CharField(max_length=120)
    slug        = models.SlugField(blank=True, unique=True)
    description = models.TextField(null=True)
    price       = models.DecimalField(max_digits=20, decimal_places=2, default=49.99)
    image       = models.ImageField(upload_to=upload_image_path, null=True, blank=True)
    featured    = models.BooleanField(default=False)
    active      = models.BooleanField(default=True)
    timestamp   = models.DateTimeField(auto_now_add=True)

如何将我的视图更改为基于类?

P.S我需要将其与下一个ListView组合

class ProductListView(ListView):
template_name = 'products/list.html'
paginate_by = 6

def get_queryset(self, *args, **kwargs):
    request = self.request
    return Product.objects.all()

def get_context_data(self, *args, **kwargs):
    context = super(ProductListView, self).get_context_data(*args, **kwargs)
    cart_object, new_object = Cart.objects.new_or_get(self.request)
    context['cart'] = cart_object
    return context

2 个答案:

答案 0 :(得分:0)

我找不到使用类的方法,但是用下一个代码解决了实际问题:

def product_list(request, category_slug=None):
category = None
categories = Category.objects.all()
products = Product.objects.all()
if category_slug:
    category = get_object_or_404(Category, slug=category_slug)
    products = Product.objects.filter(category=category)
cart_object, new_object = Cart.objects.new_or_get(request)

context = {
    'category': category,
    'categories': categories,
    'products': products,
    'cart': cart_object
}
return render(request, 'products/list.html', context)

仅在列表视图中添加了2条必要的行:

cart_object, new_object = Cart.objects.new_or_get(request)
  context = {
    'category': category,
    'categories': categories,
    'products': products,
    'cart': cart_object
}

答案 1 :(得分:-1)

您可以这样更改代码:

from django.views import View

class ProductListView(View):
    def get(self, request, category_slug=None):
        category = None
        categories = Category.objects.all()
        products = Product.objects.filter(available=True)
        if category_slug:
          category = get_object_or_404(Category, slug=category_slug)
          products = Product.objects.filter(category=category)

        context = {
            'category': category,
            'categories': categories,
            'products': products
        }
        return render(request, 'shop/product/list.html', context)

在urls.py中,您必须这样做:

urlpatterns = [
    path('productlist/', ProductListView.as_view()),
]