Как получить обратный URL для шаблона Django Flatpages - PullRequest
19 голосов
/ 17 июля 2009

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

Ответы [ 10 ]

25 голосов
/ 12 января 2010

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

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

22 голосов
/ 22 июля 2009

Включение плоских страниц в ваш корневой 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>
3 голосов
/ 19 декабря 2011

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

Лично я редко ссылаюсь на страницы за пределами главного меню веб-сайта, которое включено через {% include 'includes/nav.html' %} и выглядит так:

<ul>
    <li><a href="/about/">About</a></li>
    <li><a href="/credits/">Credits</a></li>
    ...
</ul>

Я не чувствую, что нарушаю СУХОЙ ПОЦЕЛУЙ или что-то :) :)

2 голосов
/ 22 ноября 2009

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

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

2 голосов
/ 18 июля 2009

Напишите ваши базовые 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>
1 голос
/ 21 апреля 2017

собственно Джанго> = 1.10:

urls.py

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

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

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

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

1 голос
/ 28 сентября 2013

Вам необходимо переопределить 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 голос
/ 03 июня 2011

На мой взгляд, ни одно из упомянутых решений не следовало принципу СУХОЙ, поэтому я просто сделал это:

# 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>

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

1 голос
/ 25 мая 2010

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

{{ flatpage.url }}

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

0 голосов
/ 20 мая 2016

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

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

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

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

...