如何获取Django Flatpages模板的反向url
如何获取Django Flatpages模板的反向url编写指向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/$',
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" %}