我是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
答案 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()),
]