Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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>

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