Как получить обратный URL-адрес шаблона Django Flatpages
Как получить обратный URL-адрес для шаблона Django Flatpages
Ответ 1
Включите flatpages в свой корневой 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%} (который вызывает внутреннюю обратную связь):
<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>
Ответ 2
Я предпочитаю следующее решение (требуется 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
, и обратное работает как обычно, не записывая столько кода, как в других решениях.
Приветствия.
Ответ 3
Я согласен с Anentropic, что нет смысла использовать Django Flatpages, если вам нужно написать urlconfs для их использования. Гораздо проще использовать общие представления, например 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>
Лично я редко ссылаюсь на flatpages вне основного меню веб-сайта, которое включено через {% include 'includes/nav.html' %}
и выглядит следующим образом:
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/credits/">Credits</a></li>
...
</ul>
Я не чувствую, что нарушаю СУХОЙ КИСС или что-то:)
Ответ 4
Напишите свои базовые 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>
Ответ 5
Я думал, что преимущество Flatpages в том, что вам не нужно создавать какие-либо заглушки или ссылки на URL? В противном случае это немного бессмысленно... если вы создаете представления и URL-адреса, вы можете вместо этого сохранить содержимое плоской страницы в виде шаблона html.
попробуйте это вместо:https://github.com/0sn/nameremoved/wiki/flatpages
Ответ 6
При создании любой плоской страницы вам нужно указать URL-адрес, который сохраняется как часть модели. Следовательно, вы можете получить URL-адрес от любого объекта с фиксированной структурой. В шаблоне:
{{ flatpage.url }}
Перенастройка URL-адресов в формате urls.py
, а затем использование обратного вида поражений для приложения flatpages.
Ответ 7
Ни одно из упомянутых решений не удовлетворило, по моему мнению, принципа 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>
Я мог бы добавить некоторое кэширование там, чтобы сохранить производительность, но это работает для меня.
Ответ 8
Вам нужно обновить URL-адрес и не может полагаться на официальный '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>
Ответ 9
собственно Django >= 1.10:
urls.py
urlpatterns += [
url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]
простой поиск внутри шаблона:
{% url "flatpage" url="SOME_URL" %}
где SOME_URL - это значение из поля flatpage.url
Ответ 10
В соответствии с этой документацией django для flatpages
Вы можете просто сделать
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
В вашем шаблоне.