让我的类别分别显示每个相应的内容

时间:2015-03-19 12:45:42

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

我有一个简单的项目,它有五个从我/管理面板创建的动态类别。

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 permitme在我的django管理面板中创建我自己的类别时(现在我创建了5个类别)。我也可以创建“产品”并在管理面板中自由分配给每个类别。

实际上我的项目适合在简单的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'),

)

我的问题是如何制作一个过滤器,允许我将每个产品与其各自的类别隔离?因此,每个类别的链接都显示了他们各自的产品。喜欢这样:

                <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中看到,在类别中我有这个:

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

我当时认为可以使用Product.objects.filter,但我不知道如何实现这一点以及如何为动态类别构建我的连接网址

现在我有一个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文档。

2 个答案:

答案 0 :(得分:1)

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

查看:

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 %}

答案 1 :(得分:1)

您可以尝试这样:

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

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>