django reverse django-flatpages

¿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.