夹心问题中的Django get_absolute_url模板

时间:2017-12-16 18:13:50

标签: python django templatetags

我得到的错误是:

NoReverseMatch at / Reverse for 'view_page' not found. 'view_page' is
not a valid view function or pattern name.

基本上我有一个模板标签,我的应用程序在每个页面上显示导航菜单,这是动态的,所以我不能硬编码链接。我写了一个包含标签和模板:

from django import template
from ..models import Page

register = template.Library()

@register.inclusion_tag("tags/page_links.html")
def page_links():
    all_pages = Page.objects.all()
    return {'pages': all_pages}

模板/标签目录中的模板标签html:

<ul>
  {% for page in pages %}
  <li><a href="{{ page.get_absolute_url }}">{{ page.link_name }}</a></li>
  {% endfor %}
</ul>

每个页面对象都有一个@permalink get_absolute_url()函数来获取链接。这在网站的其他部分工作正常,但这个包含标签没有。我在我的base.html文件中使用它(所以我不必将其添加到每个页面):

{% load static %}
{% load page_tags %}

...

    <p><b>Navigation:</b></p>
    {% page_links %}

...

但似乎页面在使用模板标记中的view_page视图(否则可以正常工作)时遇到问题。我在这里缺少什么?

编辑:添加了网址和模型代码

urls.py:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url

from .views import index, view_page

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),
    url(r'^$', index),
    url(r'^(?P<slug>[^\.]+).html', view_page),
]

模特:

class Page(SortableMixin):
    title = models.CharField(max_length=80, unique=True)
    slug = models.SlugField(max_length=80, unique=True)
    link_name = models.CharField(max_length=40, unique=True)
    passthrough_page = models.BooleanField(default=False)
    passthrough_link = models.CharField(max_length=40, default=None, null=True)
    content = models.TextField(default=None, null=True)

    class Meta:
        ordering = ['the_order']

    the_order = models.PositiveIntegerField(default=0, editable=False, db_index=True)

    @permalink
    def get_absolute_url(self):
        if not self.passthrough_page:
            return 'view_page', None, {'slug': self.slug}
        else:
            return self.passthrough_link

1 个答案:

答案 0 :(得分:1)

@permalink(我已被通知已被弃用)更改为直接调用reverse似乎已经成功了:

在型号代码中:

    def get_absolute_url(self):
        if not self.passthrough_page:
            return reverse('view_page', kwargs={'slug': self.slug})
        else:
            return self.passthrough_link