2015-03-19 70 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 %}