我得到的错误是:
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
答案 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