【问题标题】:Django Categories with subcategories带有子类别的 Django 类别
【发布时间】:2017-06-17 11:53:48
【问题描述】:

我能够显示类别模型(男人和女人)的类别。 现在我想将一个类别转发到带有子类别的站点,其中将显示带有产品的子类别

这是我的models.py

class Category(models.Model):
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('shop:product_list_by_category',
                       args=[self.slug])

class SubcategoryMan(models.Model):
    category = models.ForeignKey(Category,
                                 related_name='subcategorymans')
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True)

    def __str__(self):
        return self.name

class ProductMan(models.Model):
    category = models.ForeignKey(SubcategoryMan,
                                 related_name='productsman')
    name = models.CharField(max_length=200,
                            db_index=True)
    slug = models.SlugField(max_length=200,
                            db_index=True)
    image = models.ImageField(upload_to='productsman/%Y/%m/%d',
                              blank=True)
    description = models.TextField(blank=True)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        index_together = (('id', 'slug'),)

    def __str__(self):
        return self.name

这是我的views.py文件

def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = ProductMan.objects.filter(available=True)
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category=category)
    return render(request,
                  'shop/product/list.html',
                  {'category': category,
                   'categories': categories,
                   'products': products})

这是我的网址(在应用商店)

urlpatterns = [
    url(r'^$', views.product_list, name='product_list'),
    url(r'^(?P<category_slug>[-\w]+)/$',
        views.product_list,
        name='product_list_by_category')
]

这是我的 list.html

{% extends "shop/base.html" %}
{% load static %}

{% block content %}

    <ul>
        <li>
            <a href="{% url 'shop:product_list' %}">Wszystkie</a>
        </li>
        {% for c in categories %}
            <li>
                <a href="{{c.get_absolute_url}}">{{c.name}}</a>
            </li>
        {% endfor %}
    </ul>

{% endblock %}

我知道我必须为详细信息创建 URL 和视图,并展示产品,但现在我想知道我可以做些什么来创建对子类别的转发(创建视图和 URL?)

【问题讨论】:

  • 您能否更详细地解释一下“创建转发到子类别”的含义?
  • @trixn 我有男人和女人的类别。当我单击“男士转发到带有子类别(T 恤、短裤等)的新网站”时,我想这样做

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


【解决方案1】:

我有男人和女人的类别。我想当我点击男士转发到带有子类别(T 恤、短裤等)的新网站时

这不是发生的事情。您的 django 应用程序不会主动将客户端转发到某处。事实上服务器无法向客户端发送命令。 (好吧,实际上有一些方法,但你的用例中不需要这个。)

当客户端单击您呈现到上一个响应中的链接时,将请求一个新页面。点击哪个类别的信息在 url 中。 Django 根据 url 将该请求委托给正确的视图以呈现另一个模板。 您已经定义了网址。现在您需要一个视图和一个模板。 服务器和客户端之间的连接是无状态的。这意味着您的 django 不知道或跟踪客户端打开了哪个站点。它只是回答每一个请求

django tutorial 涵盖了执行此操作所需的所有代码。

附注: 您没有为每个性别将您的类别和产品拆分为单独的模型。您可以创建一个模型Product 并带有一个字段gender,它使您能够过滤该字段内容上的每个“男人类别”。像这样:

GENDER_CHOICES = (
    ('man', 'man'),
    ('woman', 'woman'),
    ('kids'), 'kids'),   # yeah that's not a gender but you could want to have this
)

class Product(models.Model): 
    category = models.ForeignKey(Category, related_name='product')
    name = models.CharField(max_length=200, db_index=True)

    # all the other product fields

    gender = models.CharField(max_length=30, choices=GENDER_CHOICES)

如果你只想要你视图中的男人产品,你可以像这样过滤它:

man_products = Product.objects.filter(gender='man')

或者这个:

# get all men's shoes from the database
man_shoes = Product.object.filter(gender='man', category__slug='shoes')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 2017-09-13
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多