Как я могу получить обратный URL-адрес для шаблона Django Flatpages
-
16-09-2019 - |
Вопрос
Как я могу получить обратный URL-адрес для шаблона Django Flatpages
Решение
Включите плоские страницы в корневой URL-адрес:
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
и обратное работает как обычно, без написания такого большого количества кода, как в других решениях.
Ваше здоровье.
я согласен с Анэнтропический что нет смысла использовать Django Flatpages, если вам нужно написать URL-адреса для их использования.Гораздо проще использовать общие представления такой как 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"),
)
Плоские страницы используют преимущества 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>
Я не чувствую, что нарушаю какой-либо DRY KISS или что-то в этом роде :)
Напишите конфигурацию базовых 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>
Я думал, что преимущество Flatpages в том, что вам не нужно создавать заглушки представлений или конфигурации URL-адресов?Иначе это немного бессмысленно...если вы создаете представления и URL-адреса, вы также можете вместо этого сохранить содержимое плоской страницы в виде HTML-шаблона.
попробуйте вместо этого:https://github.com/0sn/nameremoved/wiki/flatpages
Когда вы создаете любую плоскую страницу, вам необходимо указать URL-адрес, который сохраняется как часть модели.Следовательно, вы можете получить URL-адрес из любого объекта плоской страницы.В шаблоне:
{{ flatpage.url }}
Переназначение URL-адресов плоских страниц в urls.py
а затем необходимость использовать обратный метод противоречит цели приложения 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>
Я мог бы добавить туда немного кэширования, чтобы повысить производительность, но меня это устраивает.
Вам необходимо повторно объявить 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>
правильный Джанго >= 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>
В вашем шаблоне.