如何获取Django Flatpages模板的反向URL
答案 0 :(得分:25)
我更喜欢以下解决方案(需要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
而反之亦然,而不用像其他解决方案那样编写那么多代码。
干杯。
答案 1 :(得分:22)
在您的根urlconf中包含flatpages:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
('^pages/', include('django.contrib.flatpages.urls')),
)
然后,在您的视图中,您可以像这样调用反向:
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>
答案 2 :(得分:3)
我同意Anentropic如果您需要编写urlconf来使用它们,那么使用Django Flatpages是没有意义的。直接使用generic views如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错误并尝试在数据库中查找所请求网址的内容。主要优点是,每次必须更改其中的某些内容时,您不必直接触摸模板,缺点是需要使用数据库:)
如果您仍然选择使用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或其他东西:)
答案 3 :(得分:2)
写下您的基本网址,指向您的平面页面。假设它在页面下:
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>
答案 4 :(得分:2)
我认为Flatpages的优点是您不必创建任何视图存根或URL配置?这有点没有意义......如果你正在创建视图和网址,你可以将平面内容另外保存为模板html。
答案 5 :(得分:1)
创建任何平面页时,您需要指定一个保存为模型一部分的URL。因此,您可以从任何flatpage对象中检索URL。在模板中:
{{ flatpage.url }}
重新映射urls.py
中的平面网址,然后不得不使用反向排序来破坏flatpages应用程序的目的。
答案 6 :(得分:1)
在我看来,提到的所有解决方案都没有充分遵循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>
我可能会在那里添加一些缓存以保持性能提升,但这对我有用。
答案 7 :(得分:1)
您需要重新声明网址,不能依赖该文档鼓励我们使用的官方'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'),
...
)
现在您可以使用常用的反向网址模板标记
<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>
答案 8 :(得分:1)
正确的Django&gt; = 1.10:
urls.py
urlpatterns += [
url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]
在模板中轻松查找:
{% url "flatpage" url="SOME_URL" %}
其中SOME_URL是flatpage.url
字段
答案 9 :(得分:0)
根据此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>
在你的模板中。