inclusion_tag 模板中的 Django get_absolute_url 问题
Django get_absolute_url in inclusion_tag Issue in Template
我得到的错误是:
NoReverseMatch at / Reverse for 'view_page' not found. 'view_page' is
not a valid view function or pattern name.
基本上,我的应用程序有一个模板标签,用于在每个页面上显示导航菜单,它是动态的,因此我无法对 link 进行硬编码。我写了一个包含标签和模板:
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() 函数来获取link。这在网站的其他部分工作正常,但这个包含标签没有。我在我的 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
从 @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
我得到的错误是:
NoReverseMatch at / Reverse for 'view_page' not found. 'view_page' is not a valid view function or pattern name.
基本上,我的应用程序有一个模板标签,用于在每个页面上显示导航菜单,它是动态的,因此我无法对 link 进行硬编码。我写了一个包含标签和模板:
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() 函数来获取link。这在网站的其他部分工作正常,但这个包含标签没有。我在我的 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
从 @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