【问题标题】:Django Views. How can I change this code from functions based to class basedDjango 视图。如何将此代码从基于函数的函数更改为基于类的代码
【发布时间】:2018-12-29 15:30:33
【问题描述】:

我是 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

【问题讨论】:

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


    【解决方案1】:

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

    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
    }
    

    【讨论】:

      【解决方案2】:

      您可以像这样更改代码:

      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()),
      ]
      

      【讨论】:

      • 覆盖get和post方法通常是个坏主意;你应该选择我具体的。
      猜你喜欢
      • 1970-01-01
      • 2014-08-07
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      • 2014-02-16
      • 2021-01-24
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多