Django NoReverseMatch和空白页面

时间:2013-06-08 10:40:40

标签: django django-templates django-views

我正在使用Django 1.4.5。

当我通过管理员页面访问条目的详细信息时,我收到了错误

  

“NoReverseMatch at / admin / r / 12/1 /”:反向'详细'用   参数'()'和关键字参数'{'category':u'category',   'slug':u'entry-test'}'找不到

访问前页的条目详细信息(/ category / entry-test /)时,无/空白页

模特和权利的权利是什么? URL名称模式,如果我想通过子类别(/ category / subcategory / entry-test /)访问条目详细信息?

模型摘要:

class Entry (models.Model):
    title = models.CharField()
    slug = models.SlugField()
    category = models.ForeignKey('entry.Category')

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('entry.views.detail', (), {'category': self.category.slug, 'slug': self.slug})

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        return super(Entry, self).save(*args, **kwargs)

class Category(models.Model):
    title = models.CharField()
    slug = models.SlugField()
    parent = models.ForeignKey('self', blank=True, null=True, related_name='children')

    def __unicode__(self):
        if self.parent:
            return self.parent.title, self.title
        return self.title

    @permalink
    def get_absolute_url(self):
        return ('entry.views.category', (), {'slug': self.slug})

观看片段:

def category(request):
    category = Category.objects.all()
    return render_to_response('category.html', locals(), context_instance=RequestContext(request))

def list(request, slug_id):
    category = get_object_or_404(Category, slug=slug_id)
    list = Entry.objects.filter(category=category)
    return render_to_response("list.html", locals(), context_instance=RequestContext(request))

def detail(request, category_id, slug_id):
    entry = Entry.objects.filter(slug=slug_id)
    category = Category.objects.filter(slug=category_id)
    return render_to_response('detail.html', locals(),  context_instance=RequestContext(request))

网址摘要:

urlpatterns = patterns('entry.views',
    (r'^$', 'category', name='entry-category'),
    url(r'^(?P<slug_id>[-\w]+)/$', 'list', name='entry-list'),
    url(r'^(?P<category_id>[-\w]+)/(?P<slug_id>[-\w]+)/$', 'detail', name='entry-detail'),

模板摘录:

category.html

<ul>
{% for category in category %}
<li><a href="{{ category.slug }}">{{ category.title }}</a> ({{ category.entry_set.all.count }})</li>
{% endfor %}
</ul>

list.html

<ul>
{% for entry in list %}
<li><a href="{{ entry.slug }}">{{ entry.title }}</a></li>
{% endfor %}
</ul>

detail.html

<ul>
{% for entry in entry.category %}
<li><a href="{{ entry.category }}/{{ entry.get_absolute_url }}">{{ entry.title }}</a>
<br />{{ entry.description }}</li>
{% endfor %}
</ul>

我可能做错的地方和地点? 如果任何人可以帮助我,我会很感激!请帮帮我。

2 个答案:

答案 0 :(得分:2)

您网址的关键字参数为category_idslug_id,但您在category方法中传递了slugget_absolute_url。这个版本应该有效:

 @models.permalink
    def get_absolute_url(self):
        return ('entry.views.detail',
                (), {'category_id': self.category.slug, 'slug_id': self.slug})

另请考虑重命名您的参数。 id通常为数字,slug为字母数字。

对于您的空白页问题(来自您的评论):

您的网址/category/entry-test/ - 如果您在问题中粘贴的代码段位于主urls.py中,则会映射到您的详细信息视图。如果您没有匹配的结果(.filter()来电没有结果),您会看到一个“空白”页面,因为<ul>不会有任何li元素。

如果在您的主urls.py中,您有类似url('^category/', include(some.other.urls))的内容,则该网址会映射到您的list视图,并且您遇到同样的问题 - .filter()没有返回任何结果,因此您会看到一个“空白”页面。

答案 1 :(得分:0)

我对细节模板没什么错误:

<ul>
   {% for entry in entry %}
   <li>
      <a href="{{ entry.get_absolute_url }}">{{ entry.title }}</a>
      <br />
      {{ entry.description }}
   </li>
   {% endfor %}
</ul>

问题现在解决了。