Пользовательский тег Django больше не работает - PullRequest
0 голосов
/ 04 января 2011

Я создал пользовательский тег для отображения списка категорий и его URL, который работал до тех пор, пока я не создал подробный вид категории, в котором будут отображаться только статьи, основанные на этой категории.

Вот представление категории:

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',
     )

URL-адрес категории:

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 или текущую страницу, на которой вы находитесь.Что странно, так это то, что он правильно отображает название категории.

Кто-нибудь знает, как заставить 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

1 Ответ

3 голосов
/ 04 января 2011

Держу пари, что get_absolute_url фактически возвращает пустую строку. Это заставит ссылки перезагрузить текущую страницу. Проверьте свой HTML-код и найдите что-то вроде этого:

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

Если URL-адреса на самом деле пустые, возможно, ошибка get_absolute_url. Когда шаблон Django обнаруживает ошибку при выводе переменной шаблона, он возвращает пустую строку. Попробуйте вызвать get_absolute_url из оболочки Django и посмотрите, вернется ли он правильно:

Category.objects.all()[0].get_absolute_url()

Похоже, вы переименовали свой вид с blog_category_detail на category_detail, но забыли обновить ссылку в get_absolute_url.

Обновление: Не похоже, что обратный поиск URL для 'category_detail' будет успешным. Ваш файл URL не называет URL category_detail. Вам следует либо изменить ссылку get_absolute_url на app_name.views.category_detail (или где бы она ни хранилась), либо присвоить имя URL-адресу, заменив последнюю строку в вашем файле URL на:

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