Pregunta

¿Cómo puedo obtener la URL inversa para una plantilla de Django Flatpages

¿Fue útil?

Solución

Incluir flatpages en su URLconf raíz:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    ('^pages/', include('django.contrib.flatpages.urls')),
)

A continuación, en su opinión, puede llamar a revertir este modo:

from django.core.urlresolvers import reverse

reverse('django.contrib.flatpages.views.flatpage', kwargs={'url': '/about-us/'})
# Gives: /pages/about-us/

En las plantillas, usar la etiqueta {% url%} (que llama inversa internamente):

<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>

Otros consejos

Yo prefiero la siguiente solución (requiero 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 las plantillas

[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]

O en el código

from django.core.urlresolvers import reverse
[...]
reverse('license')
[...]

De esta manera no es necesario utilizar django.contrib.flatpages.middleware.FlatpageFallbackMiddleware y lo contrario funciona como de costumbre sin tener que escribir tanto código como en las otras soluciones.

Saludos.

Estoy de acuerdo con Anentropic que no hay sentido en el uso de Django Flatpages si es necesario escribir URLconfs a emplearlos. Es mucho más fácil de 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"),
)

Flatpages aprovechar FlatpageFallbackMiddleware, que atrapa los errores 404 y trata de encontrar el contenido de URL solicitada en su base de datos. La principal ventaja es que usted no tiene que tocar las plantillas directamente cada vez que tiene que cambiar algo en ellos, el inconveniente es la necesidad de utilizar una base de datos:)

Si aún así decide utilizar Flatpages aplicación, es mejor que el uso de etiquetas de plantilla get_flatpages:

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

En lo personal, me refiero raramente flatpages 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 me siento violo cualquiera de KISS DRY o algo:)

Escriba sus URL base conf para apuntar a sus flatpages. Asuma que está bajo páginas:

urlpatterns = patterns('',
...
    url(r'^pages/', include('project.pages.urls')),
...
)

A continuación, escriba sus flatpages de forma normal:

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'),
)

A continuación, la plantilla solo se refiere a ellos de la manera habitual:

<div id="pages">
...
    <div class="pagelinks">
        <a href="{% url about %}">ABOUT</a>
    </div>
</div>

Me pareció que la ventaja de Flatpages fue que no tenía que crear ninguna talones de ver o confs url? Es un poco inútil de lo contrario ... si va a crear puntos de vista y las direcciones URL que usted puede también guardar el contenido flatpage como html plantilla en su lugar.

probar este lugar: https://github.com/0sn/nameremoved/wiki/flatpages

Cuando se crea ningún flatpage, es necesario especificar una dirección URL que se guarda como parte del modelo. Por lo tanto, se puede recuperar la dirección URL de cualquier objeto flatpage. En una plantilla:

{{ flatpage.url }}

Reasignación de URLs flatpage en urls.py y luego tener que utilizar inversa especie de contra del propósito de la aplicación flatpages.

Ninguna de las soluciones mencionadas suficientemente siguió el principio DRY en mi opinión, por lo que acaba de hacer 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

A continuación, en cualquier plantilla que tiene que hacer un enlace, hice esto:

{% load hacks %}
...
<a href="{% flaturl 'My Page Title' %}">Page Title</a>

Yo podría añadir un poco de almacenamiento en caché de allí para mantener el rendimiento, pero esto funciona para mí.

Es necesario redeclare la conf URL y no se puede confiar en la 'django.contrib.flatpages.urls' oficial de que el documento es alentador que utilicemos.

Esto no va a ser más difícil, basta con incluir en su 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 usted puede utilizar su etiqueta de plantilla habitual url inversa

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

adecuada Django> = 1,10:

urls.py

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

fácil de búsqueda dentro de la plantilla:

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

donde SOME_URL es el valor frome el campo flatpage.url

De acuerdo con esta documentación de Django para flatpages

Usted puede simplemente 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top