我有一个简单的项目,它有五个从我/管理面板创建的动态类别。
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文档。
答案 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>