2015-03-19 69 views
0

我有一个简单的项目,从我的/管理面板创建五个动态类别。使我的类别分别显示每个相应的内容

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文档。

+1

我发现很难理解你的实际问题是什么。您是否只需要一个类别列表,并链接到一组分类页面,每个分类页面都包含该类别的产品? – 2015-03-19 13:01:04

+0

是的,先生,现在我有五个类别在我的管理面板中创建,我只想指定一个允许我在类别之间冲浪的列表,因为现在我可以在没有所需顺序的简单模板中看到所有内容。感谢评估! – Jhonny 2015-03-19 13:10:29

回答

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(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> 
+0

感谢ruddra和user640916,我用你的帮助解决了我的问题,再次感谢! – Jhonny 2015-03-20 16:33:29

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