¿Cómo puedo obtener la URL inversa para una plantilla de Django Flatpages?
reverse django-flatpages (10)
Cuando creas una página plana, necesitas especificar una URL que se guarda como parte del modelo. Por lo tanto, puede recuperar la URL de cualquier objeto de página plana. En una plantilla:
{{ flatpage.url }}
Reasignar URLs de página urls.py
en urls.py
y luego tener que usar el tipo inverso de las derrotas para el propósito de la aplicación de urls.py
.
¿Cómo puedo obtener la URL inversa para una plantilla de Django Flatpages?
Debe volver a declarar la url conf y no puede confiar en el ''django.contrib.flatpages.urls''
oficial que el documento nos alienta a usar.
Esto no será más difícil, solo incluye en tus urls.py
from django.conf.urls import patterns, url
urlpatterns += patterns('''',
...
url(r''^pages(?P<url>.*)$'', ''django.contrib.flatpages.views.flatpage'', name=''flatpage''),
...
)
Y ahora puede utilizar su etiqueta de plantilla de URL inversa habitual
<a href=''{% url ''flatpage'' url="/about-us/" %}''>About Us</a>
O para mostrar una lista de todas las páginas planas
<ul>
{% get_flatpages as flatpages %}
{% for page in flatpages %}
<li><a href="{% url ''flatpage'' url=page.url %}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Django apropiado> = 1.10:
urls.py
urlpatterns += [
url(r''^(?P<url>.*/)$'', flatpage, name=''flatpage''),
]
Búsqueda fácil dentro de la plantilla:
{% url "flatpage" url="SOME_URL" %}
donde SOME_URL es el valor del campo flatpage.url
Escribe tus urls base conf para apuntar a tus páginas planas. Supongamos que está debajo de las páginas:
urlpatterns = patterns('''',
...
url(r''^pages/'', include(''project.pages.urls'')),
...
)
Luego escribe tus páginas planas como de costumbre:
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''),
)
Entonces su plantilla simplemente se refiere a ellos de la manera habitual:
<div id="pages">
...
<div class="pagelinks">
<a href="{% url about %}">ABOUT</a>
</div>
</div>
Estoy de acuerdo con Anentropic que no tiene sentido usar Django Flatpages si necesita escribir urlconfs para emplearlos. Es mucho más sencillo usar vistas genéricas como TemplateView
directamente:
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"),
)
Las páginas planas aprovechan FlatpageFallbackMiddleware
, que FlatpageFallbackMiddleware
404 errores e intenta encontrar contenido para la URL solicitada en su base de datos. La principal ventaja es que no tiene que tocar sus plantillas directamente cada vez que tiene que cambiar algo en ellas, la desventaja es la necesidad de utilizar una base de datos :)
Si aún elige usar la aplicación Flatpages, mejor use la etiqueta de la plantilla get_flatpages
:
{% load flatpages %}
<ul>
{% for page in get_flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Personalmente, rara vez hago referencia a páginas planas fuera del menú principal del sitio web, que se incluye a través de {% include ''includes/nav.html'' %}
y se ve así:
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/credits/">Credits</a></li>
...
</ul>
No siento que viole ningún KISS SECO o algo :)
Incluya flatpages en su urlconf raíz:
from django.conf.urls.defaults import *
urlpatterns = patterns('''',
(''^pages/'', include(''django.contrib.flatpages.urls'')),
)
Entonces, en su opinión, puede llamar inverso así:
from django.core.urlresolvers import reverse
reverse(''django.contrib.flatpages.views.flatpage'', kwargs={''url'': ''/about-us/''})
# Gives: /pages/about-us/
En las plantillas, use la etiqueta {% url%} (que invoca la reversa interna):
<a href=''{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}''>About Us</a>
Ninguna de las soluciones mencionadas siguió suficientemente el principio DRY en mi opinión, así que simplemente hice esto:
# 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
Luego, en cualquier plantilla que necesite hacer un enlace, hice esto:
{% load hacks %}
...
<a href="{% flaturl ''My Page Title'' %}">Page Title</a>
Podría agregar algo de caché allí para mantener el rendimiento, pero esto funciona para mí.
Pensé que la ventaja de las páginas planas era que no tenía que crear ningún talón de vista o confs de URL. Es un poco inútil de lo contrario ... si está creando vistas y urls, también puede guardar el contenido de la página plana como una plantilla html.
intente esto en su lugar: http://wiki.github.com/0sn/nameremoved/flatpages
Prefiero la siguiente solución (requiere 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''),
)
En tus plantillas
[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]
O en tu codigo
from django.core.urlresolvers import reverse
[...]
reverse(''license'')
[...]
De esa manera, no necesita usar django.contrib.flatpages.middleware.FlatpageFallbackMiddleware
y el reverso funciona como siempre sin escribir tanto código como en las otras soluciones.
Aclamaciones.
Según esta documentación django para flatpages.
Simplemente puedes hacer
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
En su plantilla.