Как я могу получить обратный URL-адрес для шаблона Django Flatpages

21
Travis 17 Июл 2009 в 21:33

10 ответов

Лучший ответ

Включите плоские страницы в корневой 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>
24
elo80ka 22 Июл 2009 в 11:43

Я предпочитаю следующее решение (требуется 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, и обратное работает как обычно, без написания такого количества кода, как в других решениях.

Приветствия .

25
bufh 11 Янв 2010 в 21:07

Я согласен с 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"),
)

Плоские страницы используют 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>

Я не чувствую, что нарушаю сухой поцелуй или что-то в этом роде :)

3
Community 23 Май 2017 в 11:46

Напишите свои базовые URL-адреса conf, чтобы они указывали на ваши плоские страницы. Предположим, что это под страницами:

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>
2
hughdbrown 18 Июл 2009 в 02:24

На мой взгляд, ни одно из упомянутых решений в достаточной мере не следовало принципу 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>

Я мог бы добавить туда кеширование, чтобы поддерживать производительность, но у меня это работает.

2
Daniel Quinn 3 Июн 2011 в 12:59

Я думал, что преимущество Flatpages в том, что вам не нужно создавать какие-либо заглушки для просмотра или подтверждения URL-адресов? В противном случае это немного бессмысленно ... если вы создаете представления и URL-адреса, вы также можете сохранить содержимое плоской страницы как шаблон html.

Попробуйте вместо этого: https://github.com/0sn/nameremoved/wiki/flatpages

2
RamC 28 Авг 2019 в 14:19

Когда вы создаете любую плоскую страницу, вам необходимо указать URL-адрес, который сохраняется как часть модели. Следовательно, вы можете получить URL-адрес из любого объекта плоской страницы. В шаблоне:

{{ flatpage.url }}

Переназначение URL-адресов плоских страниц в urls.py и затем необходимость использовать обратный вид поражает цель приложения плоских страниц.

1
sth 4 Фев 2011 в 02:34

Вам необходимо повторно объявить URL-адрес 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'),
    ...
)

И теперь вы можете использовать свой обычный тег шаблона обратного 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
dulaccc 28 Сен 2013 в 18:40

Правильный Django> = 1.10:

Urls.py

urlpatterns += [
    url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]

Легкий поиск внутри шаблона:

{% url "flatpage" url="SOME_URL" %}

Где SOME_URL - значение из поля flatpage.url

1
patroqueeet 21 Апр 2017 в 09:08

Согласно этому документация django для плоских страниц

Вы можете просто сделать

{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

В вашем шаблоне.

0
Siddhesh Suthar 20 Май 2016 в 08:18