DjangoFlatpagesテンプレートの逆URLを取得するにはどうすればよいですか?
10 に答える
私は次の解決策を好みます(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
、他のソリューションのように多くのコードを記述しなくても、通常どおり逆に機能します。
乾杯。
ルートurlconfにフラットページを含めます。
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>
私の意見では、言及された解決策はどれも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>
パフォーマンスを維持するためにそこにキャッシュを追加するかもしれませんが、これは私にとってはうまくいきます。
フラットページを指すようにベースURLconfを記述します。それがページの下にあると仮定します:
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>
Flatpagesの利点は、ビュースタブやURL設定を作成する必要がないことだと思いましたか?それ以外の場合は少し無意味です...ビューとURLを作成している場合は、代わりにフラットページのコンテンツをテンプレートhtmlとして保存することもできます。
代わりにこれを試してください: https ://github.com/0sn/nameremoved/wiki/flatpages
使用するためにurlconfを作成する必要がある場合、DjangoFlatpagesを使用しても意味がないというAnentropicに同意します。直接などの一般的なビューを使用する方がはるかに簡単です。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>
DRYKISSなどに違反しているとは感じません:)
フラットページを作成するときは、モデルの一部として保存されるURLを指定する必要があります。したがって、任意のフラットページオブジェクトからURLを取得できます。テンプレートの場合:
{{ flatpage.url }}
フラットページのURLを再マッピングしurls.py
てから、逆の種類を使用する必要があると、フラットページアプリの目的が損なわれます。
あなたはURLconfを再宣言する必要があり'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>
適切な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>
テンプレート内。