我创建了一个自定义标记来显示一个类别列表及其网址,直到我创建了一个类别详细信息视图,该视图仅显示基于该类别的文章。
以下是类别视图:
from blog.models import Category, Entry
from django.shortcuts import render_to_response, get_object_or_404
from django.views.generic import list_detail
#for template tag to display all categories
def all_categories(request):
return render_to_response('category_detail.html', {
'categories': Category.objects.all()
})
def category_detail(request, slug):
"""
object_list
List of posts specific to the given category.
category
Given category.
"""
return list_detail.object_list(
request,
queryset = Entry.objects.filter(categories = Category.objects.filter(slug = slug)),
extra_context = {'category': Category.objects.filter(slug = slug)},
template_name = 'blog/category_detail.html',
)
分类网址:
from django.conf.urls.defaults import *
from django.views.generic.list_detail import object_list, object_detail
from blog.views.category import category_detail
from blog.models import Category, Entry
# for category detail, include all entries that belong to the category
category_info = {
'queryset' : Category.objects.all(),
'template_object_name' : 'category',
'extra_context' : { 'entry_list' : Entry.objects.all }
}
urlpatterns = patterns('',
url(r'^$', 'django.views.generic.list_detail.object_list', {'queryset': Category.objects.all() }, 'blog_category_list'),
url(r'^(?P<slug>[-\w]+)/$', category_detail),
)
和自定义类别标记:
from django import template
from blog.models import Category
def do_all_categories(parser, token):
return AllCategoriesNode()
class AllCategoriesNode(template.Node):
def render(self, context):
context['all_categories'] = Category.objects.all()
return ''
register = template.Library()
register.tag('get_all_categories', do_all_categories)
以下是我在base.html中使用自定义标记的方式:
{% load blog_tags %}
<p>
{% get_all_categories %}
<ul>
{% for cat in all_categories %}
<li><a href="{{ cat.get_absolute_url }}">{{ cat.title }}</a></li>
{% endfor %}
</ul>
</p>
在我在视图中添加category_detail之前,自定义标记会正确显示网址:/ categories / news。但是,现在自定义标记中的所有链接都会显示您的网址或当前页面。奇怪的是它正确显示了类别名称。
有谁知道如何让网址再次运作?
修改
这是我的类别模型,也许我的get_absolute_url()有问题:
import datetime
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class Category(models.Model):
title = models.CharField(max_length = 100)
slug = models.SlugField(unique = True)
class Meta:
ordering = ['title']
verbose_name_plural = "Categories"
def __unicode__(self):
return self.title
@models.permalink
def get_absolute_url(self):
return ('category_detail', (), {'slug': self.slug })
编辑:为类别模型更新了get_absolute_url,但是,这并没有解决我的问题。此外,如果我之前不清楚,甚至在更改get_absolute_url
之前,类别网址仍然有效答案 0 :(得分:3)
我打赌,get_absolute_url
实际上是返回一个空字符串。这将使链接重新加载当前页面。查看您的HTML并查找以下内容:
<a href="">Category Title Example</a>
如果网址实际为空,则get_absolute_url
可能存在错误。当Django模板在输出模板变量时遇到错误时,它返回一个空字符串。尝试从Django shell调用get_absolute_url
,看看它是否正确返回:
Category.objects.all()[0].get_absolute_url()
您似乎已将视图从blog_category_detail
重命名为category_detail
,但忘记更新get_absolute_url
中的参考。
更新:'category_detail'
的反向网址查找不会成功。您的网址文件未命名category_detail
网址。您应该将get_absolute_url
引用更改为app_name.views.category_detail
(或存储在何处),或者通过将网址文件中的最后一行替换为以下内容来命名网址:
url(r'^(?P<slug>[-\w]+)/$', category_detail, name='category_detail'),
要查找问题的根源,您应该从命令行调试此代码。这样的事情应该做:
$ python manage.py shell
>>> from blog.mobels import Category
>>> cat = Category.objects.all()[0]
>>> cat.get_absolute_url()