21

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

4

10 回答 10

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像往常一样使用和反向工作,而无需像其他解决方案那样编写太多代码。

干杯。

于 2010-01-11T21:07:46.493 回答
24

在你的根 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>
于 2009-07-22T11:43:51.053 回答
2

编写您的基本 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>
于 2009-07-18T02:24:20.490 回答
2

在我看来,提到的解决方案都没有充分遵循 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>

我可能会在其中添加一些缓存以保持性能,但这对我有用。

于 2011-06-03T12:50:01.667 回答
2

我认为 Flatpages 的优点是您不必创建任何视图存根或 url confs?否则这有点毫无意义......如果您正在创建视图和网址,您不妨将平面页面内容保存为模板 html。

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

于 2009-11-22T14:30:06.807 回答
2

我同意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 之类的:)

于 2011-12-19T16:39:17.303 回答
1

当您创建任何平面页面时,您需要指定一个作为模型一部分保存的 URL。因此,您可以从任何平面页面对象中检索 URL。在模板中:

{{ flatpage.url }}

重新映射平面页面 URL,urls.py然后必须使用反向排序,这违背了平面页面应用程序的目的。

于 2010-05-24T20:34:55.827 回答
1

您需要重新声明 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>
于 2013-09-28T18:40:08.973 回答
1

正确的 Django>= 1.10:

网址.py

urlpatterns += [
    url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]

在模板内轻松查找:

{% url "flatpage" url="SOME_URL" %}

其中 SOME_URL 是该flatpage.url字段的值

于 2017-04-21T09:08:13.530 回答
0

根据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>

在您的模板中。

于 2016-05-20T08:18:46.803 回答