如何获取Django Flatpages模板的反向URL

时间:2009-07-17 17:33:52

标签: django reverse django-flatpages

如何获取Django Flatpages模板的反向URL

10 个答案:

答案 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 viewsTemplateView更为直接:

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。

试试这个: http://wiki.github.com/0sn/nameremoved/flatpages

答案 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>

在你的模板中。