使我的类别单独显示每个相应的内容

Make that my categories displays each respective content isolatedly

我有一个简单的项目,其中包含从我的 /admin 面板创建的五个动态类别。

models.py:

from django.db import models
from django.template.defaultfilters import slugify    

class TimeStampModel(models.Model):

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True

class Category(models.Model):

    name = models.CharField(max_length=50)
    slug = models.SlugField(editable=False)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.name)
        super(Category, self).save(*args, **kwargs)

    def __str__(self):
        return self.name

这是我的 views.py:

from django.shortcuts import render
from django.views.generic import TemplateView, DetailView
from .models import Product, Category

class SingleCatView(TemplateView):

    template_name = 'products/single_category.html'

    def get_context_data(self, **kwargs):
        context = super(SingleCatView, self).get_context_data(**kwargs)
        context['products'] = Product.objects.all().order_by('-created')[:6]
        context['categories'] = Category.objects.all()
        return context

class SingleProView(DetailView):

    template_name = 'products/single_product.html'
    model = Product

如您所见,我的 models.py 允许我在我的 Django 管理面板中创建我自己的类别(现在我创建了 5 个类别)。我也可以创建 "products" 并在管理面板中自由地将它们分配给每个类别。

实际上我的项目经过调整,可以简单地显示我的产品混合在一起template.html,我可以看到所有没有过滤器。

urls.py

from django.conf.urls import patterns, include, url
from .views import SingleCatView, SingleProView

urlpatterns = patterns('',
    url(r'^jbpfamilies/category/$', SingleCatView.as_view(), name='vista_category'),
    url(r'^jbpfamilies/category/(?P<pk>\d+)/$', SingleProView.as_view(), name='vista_product'),

)

我的问题是如何制作一个过滤器,使我能够将每个产品与其各自的类别隔离开来?因此,每个类别的 link 向我展示了他们各自的产品。 像这样:

                <ul>
                    <li><a href="#">Category1</a></li>
                    <li><a href="#">Category2</a></li>
                    <li><a href="#">Category3</a></li>
                    <li><a href="#">Category4</a></li>
                    <li><a href="#">Category5</a></li>
                </ul>

我会为每个类别做一个模板吗?或者我可以将我的 single_category.html 用于所有类别,就像我对我的产品所做的那样,使用一个模板来展示任何产品(我认为这是更好的形式)

如果你在我的 views.py 类别中看到 class 我有这个:

context['products'] = Product.objects.all().order_by('-created')[:6]

我认为可以使用 Product.objects.filter,但我不确定如何实现它以及如何为动态类别构建我的串联 url

现在我有一个 simple_category.html 显示所有类别的所有产品:

<!-- Start Content -->
    <div id="content">
        <div class="container">

            <div class=" portfolio-page portfolio-4column">
            <ul id="portfolio-list" data-animated="fadeIn">
            {% for product in products %}
                <li>
                    <img src="{{ product.pimage0.url }}" alt="{{ product.name }}" />
                    <div class="portfolio-item-content">
                        <span class="header">{{ product.name }}</span>
                        <p class="body">{{ product.size }}</p>
                    </div>
                    <a href="{% url 'products:vista_product' product.id %}"><i class="more">+</i></a>

                </li>
            {% endfor %}
            </ul>
            </div>

        </div>
    </div>
    <!-- End Content -->

对不起,如果我的问题太大了,但我在这一点上真的很困惑,仍在阅读 django 文档。

这是一些伪代码,因为我现在无法亲自尝试,但这是实现您想要的目标的一种方法。这样做,您甚至不需要单独的视图来显示所有或仅显示一个类别的产品。

查看:

class ProductView(TemplateView):

    def get_context_data(self, **kwargs):
        context = super(ProductView, self).get_context_data(**kwargs)
        products = Products.objects.all() # show all by default
        # Check if the request had a GET query parameter with name 'cat'
        cat = self.request.GET.get('cat', None)
        if cat:
            # yes, then show only that given categories products
            products = products.filter(category=cat)

模板:

遍历您的类别查询集以生成指向您的产品视图的链接并向每个链接添加 GET 参数。

{% for c in categories %}
<li><a href="?cat={{c}}">{{c}}</a></li>
{% endfor %}

你可以这样试试:

**这里我假设产品与类别有外键关系,例如:

class Product(models.Model):
    ...
    category = models.ForeignKey(Category)

现在所有类别,视图如下:

class AllCategories(ListView):
    model = Category
    template = 'category_all.html'

category_all.html 模板应如下所示:

 <ul>
 {% for cat in object_list %}
      <li> <a href='{% url 'category_details' pk=cat.pk %}'></li> {{ cat.name }}</a> {# This url name has been defined in later section of this answer. #}
    {% endfor %}
</ul>

对于单个类别,视图如下:

class SingleCat(DetailView):
    model = Category
    template = 'category_single.html'

    def get_context_data(self, **kwargs):
       context = super().get_context_data(**kwargs)
       current_category = context['object']
       context['products'] = current_category.product_set.all()
       return context

url是这样的:

...
url(r'^(?P<pk>\d+)$', SingleCat.as_view(), name='category_details'),
...

模板 category_single.html 就像:

<h3>{{ object.name }}</h3>    
<ul>
{% for prod in products %}  
    <li>{{ prod.name }} </li>    
{% enfor %}    
</ul>