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

如何获取Django Flatpages模板的反向url,django,reverse,django-flatpages,Django,Reverse,Django Flatpages,如何获取Django Flatpages模板的反向url编写指向Flatpages的基本url配置文件。假设它位于以下页面下: urlpatterns = patterns('', ... url(r'^pages/', include('project.pages.urls')), ... ) 然后像平常一样写下你的页面: urlpatterns = patterns('django.views.generic.simple', url(regex=r'^resume/$',

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

编写指向Flatpages的基本url配置文件。假设它位于以下页面下:

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>

...

在根urlconf中包含flatpages:

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):


我认为Flatpages的优势在于您不必创建任何视图存根或url地址?否则就没什么意义了。。。如果您正在创建视图和URL,您也可以将flatpage内容保存为模板html

请尝试以下方法:
我更喜欢以下解决方案(需要Django>=1.0)

settings.py
url.py
在模板中 这样,您就不需要使用
django.contrib.flatpages.middleware.FlatpageFallbackMiddleware
,反之亦然,无需像其他解决方案那样编写太多代码


干杯。

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

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

url.py
中重新映射flatpage URL,然后不得不使用反向排序,这就违背了flatpages应用程序的目的。

在我看来,提到的任何解决方案都没有充分遵循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>
然后在任何需要创建链接的模板中,我都这样做了:

# 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>
{%loadhacks%}
...
我可能会在其中添加一些缓存以保持性能,但这对我来说很有效。

我同意,如果需要编写URLConf来使用Django Flatpages,那么使用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\u Flatpages
模板标记:

{% load flatpages %}
<ul>
    {% for page in get_flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

我不觉得我违反了任何干吻之类的规定:)

你需要重新声明url配置,不能依赖官方的文件鼓励我们使用的
'django.contrib.flatpages.url'

这不会更困难,只需包含在
url.py中即可

from django.conf.urls import patterns, url

urlpatterns += patterns('',
    ...
    url(r'^pages(?P<url>.*)$', 'django.contrib.flatpages.views.flatpage', name='flatpage'),
    ...
)
来自django.conf.url导入模式,url
urlpatterns+=模式(“”,
...
url(r'^pages(?P.*)','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>
    {%get_flatpages作为flatpages%} {flatpages%中的页面为%s}
  • {%endfor%}
根据此

你可以简单地做

{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>
{%loadflatpages%}
{%get_flatpages作为flatpages%}
    {flatpages%中的页面为%s}
  • {%endfor%}
在您的模板中。

正确的Django>=1.10:

url.py

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

其中SOME_URL是
flatpage.URL
字段中的值

elo80ka,感谢您这么好的安排。看起来连我都能跟上。这似乎有点违反了DRY原则(我希望我能理解什么是DRY),但我想这是没有办法实现的。答案很好,我唯一想知道的是关于模板的问题。如果在模板中放置“/about us/”,则无法达到目的。如果我进入django admin并将/about us/更改为其他内容,则模板将不再起作用。还是我遗漏了什么?@Chris:你说得对……你可能会得到404分。我想说,您有几种选择:(a)使用上下文处理器查找所有flatpages的URL,并将其推送到模板中,或者(b)使用Selenium/Webdriver等工具测试所有URL并捕获404。哦,还有(c)不要使用Flatpages:)您的解决方案和我的解决方案(它也不需要
FlatPageFallbackMiddleware
)之间唯一真正的区别是使用命名的urlpatterns(正如您指出的,在1.0之前不可用)。也就是说,我认为(为了可维护性)最好是将所有URL都列在urlconf中,而不是列在模板中,这样做的代价可能会有点冗长+1是的
get_flatpages
非常适合创建页脚菜单、网站地图等。只获取以基本url开头的flatpages:
{%get_flatpages'/about/'as about_pages%}
。这有助于在所有flatpages之间循环,但如果您只需要特定的flatpageURL,则无法实现。
<ul>
    {% get_flatpages as flatpages %}
    {% for page in flatpages %}
        <li><a href="{% url 'flatpage' url=page.url %}">{{ page.title }}</a></li>
    {% endfor %}
</ul>
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>
urlpatterns += [
    url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]
{% url "flatpage" url="SOME_URL" %}