проблема в том что в базовом шаблоне ссылка категории ведёт на урл которого нету в древе "блог". они на одном иерархическом уровне, если вы хотите чтоби этот урл был в древе "блог" нужно соответствующим способом переделать навигацию, или добавить в главный файл урл
url(r'^category/$', CategoryListView.as_view(), name='category_list'),
я б делал категории как фильтр отображения, а список категорий как ссилки вывел бы в боковой панели
ОК, спасибо, буду дальше разбираться. Сейчас переделал свои представления,модели и урлы, но почему-то теперь у меня не работает reverse, выдает NoReverseMatch и соответственно мои функции get_absolute_url, разбираюсь. Как говориться не легко в учении, легко в бою:-)
blog/urls.py:
# coding: utf-8
from django.conf.urls import patterns, url
from blog.views import IndexView, CategoryView, TagsView, PostShow, AboutView
urlpatterns = patterns('',
url(r'^$', IndexView.as_view(), name='home'),
url(r'^(?P<catslug>[-\w\d]+)/(?P<postslug>[-\w\d]+)/$',
PostShow.as_view(), name='postshow'),
url(r'^(?P<slug>[-\w\d]+)/$', CategoryView.as_view(), name='categoryshow'),
url(r'^tag/(?P<tagslug>[-\w\d]+)/$', TagsView.as_view(), name='tagshow'),
url(r'^about/$', AboutView.as_view(), name='about'),
)
blog/views.py:
# coding: utf-8
from django.views.generic import ListView, DetailView, TemplateView
from blog.models import Post
from django.shortcuts import get_object_or_404
from django.core.paginator import Paginator
class PostList(ListView):
"""
Общий класс для задания параметров отображения статей
"""
context_object_name = 'posts'
paginate_by = 5
allow_empty = True
template_name = 'posts.html'
class IndexView(PostList):
"""
Отображение главной страницы блога
"""
queryset = Post.objects.filter(published=True).order_by('-created')
class AboutView(TemplateView):
"""
Вывод страницы - О блоге
"""
template_name = 'about.html'
class CategoryView(PostList):
"""
Отображение списка категорий
"""
def get_queryset(self):
return Post.objects.filter(category__slug=self.kwargs['slug'],
published=True).order_by('-created')
class TagsView(PostList):
"""
Отображение ключевых слов (тегов)
"""
def get_queryset(self):
return Post.objects.filter(tags__name__in=[self.kwargs['slug']],
published=True).order_by('-created')
class PostShow(PostList):
"""
Отображение выбранной статьи
"""
context_object_name = 'post'
template_name = 'post.html'
def get_object(self):
return get_object_or_404(Post.objects.filter(category__slug=self.kwargs['catslug'],
slug=self.kwargs['postslug'])).order_by('-created')
blog/models.py:
# coding: utf-8
from django.db import models
from taggit.managers import TaggableManager
from django.contrib.auth.models import User
from tinymce.models import HTMLField
from django.core.urlresolvers import reverse
class Category(models.Model):
"""
Категории для статей
"""
name = models.CharField(u'Категория', max_length=100)
slug = models.SlugField(u'Cсылка', unique=True, help_text=u'Текст ссылки')
description = models.TextField(u'Описание', blank=True, null=True)
parent = models.ForeignKey('self', blank=True, null=True)
class Meta:
verbose_name = u'Категория'
verbose_name_plural = u'категории'
def __unicode__(self):
return '%s' % self.name
def get_absolute_url(self):
return reverse('categoryshow', args=[self.slug])
class Post(models.Model):
"""
Статьи размещаемые на сайте
"""
title = models.CharField(u'Статья', max_length=255)
slug = models.SlugField(u'Cсылка', unique=True, help_text=u'Текст ссылки')
content = HTMLField(verbose_name='Текст статьи')
created = models.DateTimeField(u'Дата публикации', auto_now_add=True)
published = models.BooleanField(u'Показывать', default=False)
private = models.BooleanField(u'Приватное', default=False)
image = models.ImageField(u'Картинки для статьи', upload_to='media/')
category = models.ForeignKey(Category, verbose_name=u'Категория')
tags = TaggableManager(verbose_name=u'Ключевые слова', blank=True)
author = models.ForeignKey(User, verbose_name=u'Автор статьи')
class Meta:
verbose_name = u'Статья'
verbose_name_plural = u'статьи'
ordering = ['-created', 'title']
def __unicode__(self):
return '%s' % self.title
def get_absolute_url(self):
return reverse('postshow', args=[self.category.slug, self.slug])