如何获取 Django Flatpages 模板的反向 url
10 回答
我更喜欢以下解决方案(需要 Django >= 1.0)。
settings.py
INSTALLED_APPS+= ('django.contrib.flatpages',)
urls.py
urlpatterns+= patterns('django.contrib.flatpages.views',
url(r'^about-us/$', 'flatpage', {'url': '/about-us/'}, name='about'),
url(r'^license/$', 'flatpage', {'url': '/license/'}, name='license'),
)
在您的模板中
[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]
或在您的代码中
from django.core.urlresolvers import reverse
[...]
reverse('license')
[...]
这样你就不需要django.contrib.flatpages.middleware.FlatpageFallbackMiddleware
像往常一样使用和反向工作,而无需像其他解决方案那样编写太多代码。
干杯。
在你的根 urlconf 中包含平面页面:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
('^pages/', include('django.contrib.flatpages.urls')),
)
然后,在您看来,您可以像这样调用 reverse :
from django.core.urlresolvers import reverse
reverse('django.contrib.flatpages.views.flatpage', kwargs={'url': '/about-us/'})
# Gives: /pages/about-us/
在模板中,使用 {% url %} 标记(在内部调用 reverse):
<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>
编写您的基本 urls conf 以指向您的平面页面。假设它在页面下:
urlpatterns = patterns('',
...
url(r'^pages/', include('project.pages.urls')),
...
)
然后像往常一样写你的平面页面:
urlpatterns = patterns('django.views.generic.simple',
url(regex=r'^resume/$', view='direct_to_template', kwargs={'template': 'resume.html'}, name='resume'),
url(regex=r'^about/$', view='direct_to_template', kwargs={'template': 'about.html'}, name='about'),
url(regex=r'^books/$', view='direct_to_template', kwargs={'template': 'library.html'},name='books'),
)
然后您的模板只是以通常的方式引用它们:
<div id="pages">
...
<div class="pagelinks">
<a href="{% url about %}">ABOUT</a>
</div>
</div>
在我看来,提到的解决方案都没有充分遵循 DRY 原则,所以我只是这样做了:
# core/templatetags/hacks.py
from django import template
register = template.Library()
@register.simple_tag
def flaturl(title):
"""
Returns the url for a flatpage based on the title.
NOTE: Obviously the title must be unique.
"""
from django.contrib.flatpages.models import FlatPage
try:
page = FlatPage.objects.get(title=title)
except:
return ""
return page.url
然后在任何需要建立链接的模板中,我这样做了:
{% load hacks %}
...
<a href="{% flaturl 'My Page Title' %}">Page Title</a>
我可能会在其中添加一些缓存以保持性能,但这对我有用。
我认为 Flatpages 的优点是您不必创建任何视图存根或 url confs?否则这有点毫无意义......如果您正在创建视图和网址,您不妨将平面页面内容保存为模板 html。
我同意Anentropic的观点,如果你需要编写 urlconfs 来使用 Django Flatpages,那么使用它们是没有意义的。直接使用通用视图要简单得多,例如TemplateView
:
from django.conf.urls import patterns, url
from django.views.generic import TemplateView
urlpatterns = patterns('',
url(r'^about/$', TemplateView.as_view(template_name="about.html"), name="about"),
)
Flatpages 利用FlatpageFallbackMiddleware
,它捕获 404 错误并尝试在您的数据库中查找请求的 url 的内容。主要优点是每次必须更改模板时都不必直接触摸模板,缺点是需要使用数据库:)
如果你仍然选择使用 Flatpages 应用程序,你最好使用get_flatpages
模板标签:
{% load flatpages %}
<ul>
{% for page in get_flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
就个人而言,我很少引用网站主菜单之外的平面页面,该菜单包含在其中{% include 'includes/nav.html' %}
,如下所示:
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/credits/">Credits</a></li>
...
</ul>
我不觉得我违反了任何 DRY KISS 之类的:)
当您创建任何平面页面时,您需要指定一个作为模型一部分保存的 URL。因此,您可以从任何平面页面对象中检索 URL。在模板中:
{{ flatpage.url }}
重新映射平面页面 URL,urls.py
然后必须使用反向排序,这违背了平面页面应用程序的目的。
您需要重新声明 url conf 并且不能依赖'django.contrib.flatpages.urls'
文档鼓励我们使用的官方。
这不会更难,只需包含在您的urls.py
from django.conf.urls import patterns, url
urlpatterns += patterns('',
...
url(r'^pages(?P<url>.*)$', 'django.contrib.flatpages.views.flatpage', name='flatpage'),
...
)
现在您可以使用常用的反向 url 模板标签
<a href='{% url 'flatpage' url="/about-us/" %}'>About Us</a>
或显示所有平面页面的列表
<ul>
{% get_flatpages as flatpages %}
{% for page in flatpages %}
<li><a href="{% url 'flatpage' url=page.url %}">{{ page.title }}</a></li>
{% endfor %}
</ul>
正确的 Django>= 1.10:
网址.py
urlpatterns += [
url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]
在模板内轻松查找:
{% url "flatpage" url="SOME_URL" %}
其中 SOME_URL 是该flatpage.url
字段的值
根据this django documentation for flatpages
你可以简单地做
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
在您的模板中。