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

StackOverflow https://stackoverflow.com/questions/1144691

Вопрос

Как я могу получить обратный 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>

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top