【问题标题】:Django get_absolute_url in inclusion_tag Issue in Template模板中的inclusion_tag问题中的Django get_absolute_url
【发布时间】:2017-12-16 18:13:50
【问题描述】:

我得到的错误是:

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}

以及templates/tags目录下的模板标签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 视图(否则有效)似乎有问题。我在这里错过了什么?

编辑:添加 URL 和模型代码

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

【问题讨论】:

  • 您需要显示您的网址和页面get_absolute_url 方法。
  • 另外,您使用的是什么版本的 Django?永久链接在 1.11 中已弃用。
  • 感谢您的回复 - 上面添加的代码,django 版本是 2.0。我将尝试将反向添加到 get_absolute_url 代码中,看看是否可以解决问题。
  • 似乎是 reverse@permalink 的问题 - 当我在 get_absolute_url 函数中将其更改为 reverse 调用时,一切正常。感谢您的帮助!

标签: python django templatetags


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2010-12-19
    • 2010-10-03
    • 2012-05-14
    相关资源
    最近更新 更多