【问题标题】:How can I display different results onto separate templates from one model in Django, using class based views?如何使用基于类的视图在 Django 中的一个模型的不同模板上显示不同的结果?
【发布时间】:2020-05-21 08:42:29
【问题描述】:

我有一个模型:

class Product(models.Model):
    slug = models.SlugField(unique=True)
    image = models.ImageField(upload_to='media')
    title = models.CharField(max_length=150)
    description = models.TextField()
    short_description = models.CharField(max_length=300)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    discount_price = models.DecimalField(max_digits=5, decimal_places=2, blank=True, null=True) 
    stock_quantity = models.PositiveIntegerField(default=10)
    in_stock = models.BooleanField(default=True)
    on_sale = models.BooleanField(default=False)
    date_added = models.DateTimeField(auto_now_add=True, blank=True)
    main_category = models.CharField(default='FW', choices=CATEGORY_CHOICES, max_length=2)
    additional_category = models.CharField(choices=CATEGORY_CHOICES, max_length=2, blank=True, null=True)
    brand = models.CharField(choices=CATEGORY_CHOICES, max_length=2, blank=True, null=True)
    size = models.CharField(max_length=2, choices=CATEGORY_CHOICES, default='M', blank=True, null=True)


    def __str__(self):
        return self.title

在此模型中将包含各种类型的产品,例如衣服和书籍。 这些将由模型中的 main_category 和 additional_category 字段定义。 如果输入数据库的产品是一件衣服,我将输入尺寸和品牌的值。对于书籍,这些显然是空白的。

但是,如果产品是一件衣服,我有女装、男装和儿童服装。我将能够通过在 main_category 字段中选择“女性”来定义这些。

在我的模板中,我想动态显示一个显示所有衣服的页面,一个显示“女性服装”的页面,另一个显示“男性服装”等的页面。然后是一个显示所有书籍的页面,基于 main_category 和 additional_category 的青少年书籍、成人书籍等。

如果我输入一个产品,并且主要类别是“女性”,而附加类别是“加大码”,我想要一个模板来动态显示在 main_category 或附加类别中选择了“女性”的所有产品.还有一个显示所有加大码服装的模板,其中 main_category OR additional_category 是“加大码”。

我在编写视图时遇到了麻烦。我是否需要为女性服装、加大码服装、儿童服装、书籍、成人书籍、青少年书籍等提供视图。或者我可以只编写一个视图,将正确的数据输出到多个模板。基本上,每个模板需要一个视图吗?

我已阅读:

https://docs.djangoproject.com/en/3.0/topics/class-based-views/generic-display/

并查看了 get_context_data。我可以定义多个 get_context_data 函数来为不同的模板返回不同的过滤信息,如果可以,我如何区分它们?

我目前正在学习,正在使用 Django 建立一个虚拟在线商店以尽可能多地学习,但发现这特别复杂?

谢谢

【问题讨论】:

    标签: django django-models django-templates django-views django-context


    【解决方案1】:

    一种更简洁的方法是创建一个名为 Product 的抽象模型,并将其用作不同产品类型(如衣服和书籍)的基类。

    Product 是一个抽象类意味着 Django 的 ORM 不会在数据库上创建 Product 表。相反,它将为每个子类创建表,包括您在 Product 类上定义的公共字段。检查下面的代码以更好地理解:

    # models.py
    from django.db import models
    
    class Product(models.Model):
        image = models.ImageField(upload_to='media')
        title = models.CharField(max_length=150)
        # ... (other common fields)
    
        class Meta:
            abstract = True
    
    class Clothes(Product):
        size = models.CharField(max_length=2, choices=CATEGORY_CHOICES, default='M', blank=True, null=True)
        # ... (other specific fields)
    

    来自 django docs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      相关资源
      最近更新 更多