【问题标题】:Django custom tag no longer worksDjango 自定义标签不再起作用
【发布时间】:2011-01-04 02:39:12
【问题描述】:

我制作了一个自定义标签来显示类别列表及其网址,直到我制作了一个仅显示基于类别的文章的类别详细信息视图。

这是分类视图:

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 之前,自定义标签会正确显示 url,例如:/categories/news。但是,现在自定义标签中的所有链接都只显示您所在的 url 或当前页面。奇怪的是它正确显示了类别名称。

有谁知道如何让网址再次工作?

编辑

这是我的类别模型,也许我的 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,但是,这并没有解决我的问题。此外,如果我之前不清楚,类别 url 甚至在更改 get_absolute_url 之前就起作用了

【问题讨论】:

    标签: django url tags permalinks


    【解决方案1】:

    我敢打赌get_absolute_url 实际上返回的是一个空字符串。这将使链接重新加载当前页面。检查您的 HTML 并寻找类似的内容:

    <a href="">Category Title Example</a>
    

    如果 URL 实际上是空白的,则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' 的反向 URL 查找不会成功。您的 urls 文件未命名 category_detail URL。您应该将 get_absolute_url 引用更改为 app_name.views.category_detail(或存储它的任何位置)或通过将 urls 文件中的最后一行替换为:

    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()
    

    【讨论】:

    • 你是正确的,网址是空的。我用我的类别模型更新了我的帖子
    • 看起来 blog_category_detail in get_absolute_url 应该是 category_detail (您在问题中引用的视图的名称)。
    • 好的,我在类别模型的 get_absolute_url 中将 blog_category_detail 更改为 category_detail,但这并没有解决问题
    • 我注意到代码中的另一个错误。你真的打开了一个 Django shell 并通过运行get_absolute_url 来调试这个错误,看看到底发生了什么错误。
    • 谢谢 Trey,将 name='category_detail' 添加到 url 有效
    猜你喜欢
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2013-09-11
    • 1970-01-01
    • 2017-04-26
    • 2018-12-04
    • 1970-01-01
    相关资源
    最近更新 更多