我怎么能得到的反url Django简单页面模板
-
16-09-2019 - |
题
我怎么能得到的反url Django简单页面模板
解决方案
包含的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%}标签(它调用反向内部):
<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>
其他提示
我更喜欢以下溶液(需要的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
和反向这样照常工作,没有写了这么多的代码中的其他解决方案。
干杯。
我同意 Anentropic 的,有在使用Django的flatpages如果你需要写的URLconf聘请他们没有任何意义。它更容易使用这样通用意见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' %}
包括并看起来像这样的外部的flatpages:
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/credits/">Credits</a></li>
...
</ul>
我不觉得我违反任何干KISS什么的:)
写您的基本URL CONF以指向您的flatpages。假设它是下的网页:
urlpatterns = patterns('',
...
url(r'^pages/', include('project.pages.urls')),
...
)
然后编写的flatpages为正常:
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>
我想的flatpages的好处是你没有创建任何视图存根或URL confs?这是一个有点毫无意义,否则......如果你创建视图和URL您不妨保存简单页面内容HTML模板代替。
当您创建的任何简单页面,你需要指定其保存为模型的一部分的URL。因此,你可以从任何简单页面对象中的URL。在模板:
{{ flatpage.url }}
重新映射在urls.py
简单页面的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>
我可以在里面添加一些缓存来保持较高的性能,但是这对我的作品。
您需要重新声明网址的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'),
...
)
现在你可以用你平常的反向链接的模板标签
<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>
适当的Django> = 1.10:
urls.py
urlpatterns += [
url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]
在模板中查找容易:
{% url "flatpage" url="SOME_URL" %}
其中SOME_URL是值弗罗姆flatpage.url
字段
根据这个 django文件简单页面
你可以简单地做
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
在你的模板。