Как я могу отображать разные результаты на отдельных шаблонах из одной модели в Django, используя представления на основе классов? - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть одна модель:

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.

В моих шаблонах я хотел бы динамически отображать страницу, которая отображает всю одежду, одну - «одежду для женщин», другую страницу - «одежду для мужчин» et c et c. И затем страница, которая отображает все книги, книги для подростков, книги для взрослых и т. Д. c, основанные на main_category и extra_category.

Если я вхожу в продукт, а основная категория - «для женщин», а дополнительная категория - «плюс размер», я хотел бы, чтобы шаблон динамически отображал все продукты, для которых выбрано «для женщин». главная_категория ИЛИ дополнительная_категория. И шаблон, который отображает одежду всех размеров плюс, где main_category ИЛИ дополнительная_категория - «плюс размер».

Моя проблема возникает, когда я пишу представления. Нужно ли предоставлять для просмотра только женскую одежду, плюс размер только одежду, детскую одежду, книги, книги для взрослых, книги для подростков и др. c. Или я могу написать только один вид, который выводит правильные данные на несколько шаблонов. По сути, мне нужно одно представление для каждого шаблона?

Я прочитал это:

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

и взглянул на get_context_data. Могу ли я определить несколько функций get_context_data, чтобы они возвращали различную отфильтрованную информацию для разных шаблонов, и если да, то как мне различать их?

Я в настоящее время учусь и создаю фиктивный онлайн-магазин с Django, чтобы учиться насколько это возможно, но найти это особенно сложным?

Спасибо

1 Ответ

0 голосов
/ 05 февраля 2020

Более чистый способ сделать это - создать абстрактную модель с именем Product и использовать ее в качестве базового класса для различных типов продуктов, таких как одежда и книги.

Быть Product абстрактным классом означает что ORM Django не создаст таблицу 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 документы .

...