Question

Comment puis-je obtenir l'URL inverse pour un modèle Django Flatpages

Était-ce utile?

La solution

Inclure flatpages dans votre URLconf racine:

from django.conf.urls.defaults import *

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

Alors, à votre avis, vous pouvez appeler inverse comme ceci:

from django.core.urlresolvers import reverse

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

Dans les modèles, utilisez la balise (qui appelle inverse interne) {% de url%}:

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

Autres conseils

Je préfère la solution suivante (Django requiers> = 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'),
)

Dans vos modèles

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

Ou dans votre code

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

De cette façon, vous n'avez pas besoin d'utiliser django.contrib.flatpages.middleware.FlatpageFallbackMiddleware et l'inverse fonctionne comme d'habitude sans écrire de code tant que dans les autres solutions.

Vive.

Je suis d'accord avec Anentropic qu'il n'y a pas de point à l'aide de Django Flatpages si vous devez écrire URLconfs pour les employer. Il est beaucoup plus simple à utiliser vues génériques tels que TemplateView directement:

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 tirer profit des FlatpageFallbackMiddleware, qui attire 404 erreurs et essaie de trouver le contenu pour l'URL demandée dans votre base de données. Le principal avantage est que vous ne touchez pas à vos modèles directement chaque fois que vous devez changer quelque chose en eux, l'inconvénient est la nécessité d'utiliser une base de données:)

Si vous choisissez toujours utiliser l'application Flatpages, vous feriez mieux utiliser le modèle de get_flatpages tag:

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

Pour ma part, je fais référence rarement flatpages en dehors du menu principal du site, qui est inclus par {% include 'includes/nav.html' %} et ressemble à ceci:

<ul>
    <li><a href="/about/">About</a></li>
    <li><a href="/credits/">Credits</a></li>
    ...
</ul>

Je ne pense pas que j'enfreins DRY BAISER ou quelque chose:)

Écrivez vos urls de base pour pointer vers conf votre flatpages. Supposons qu'il est dans les pages:

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

Ensuite, écrivez votre flatpages comme 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'),
)

Ensuite, votre modèle fait référence juste pour eux de la manière habituelle:

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

Je pensais que l'avantage de Flatpages vous a ne pas créer de vue ou talons confs url? Il est un peu inutile sinon ... si vous créez des vues et urls vous pouvez ainsi enregistrer le contenu flatpage comme modèle html à la place.

essayez ceci: https://github.com/0sn/nameremoved/wiki/flatpages

Lorsque vous créez une flatpage, vous devez spécifier une URL qui est enregistrée dans le cadre du modèle. Par conséquent, vous pouvez récupérer l'URL de tout objet flatpage. Dans un modèle:

{{ flatpage.url }}

Réaffectation URL flatpage dans urls.py puis d'avoir à utiliser les défaites inverse en quelque sorte le but de l'application de flatpages.

Aucune des solutions mentionnées suffisamment suivi le principe DRY à mon avis, donc je viens de faire ceci:

# 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

Ensuite, dans un modèle qui a besoin de faire un lien, je l'ai fait:

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

Je pourrais ajouter une mise en cache là-bas pour maintenir la place de la performance, mais cela fonctionne pour moi.

Vous devez redéclarer l'url et conf ne peut pas compter sur le 'django.contrib.flatpages.urls' officiel que le doc nous encourage à utiliser.

Ce ne sera pas plus difficile, il suffit d'inclure dans votre urls.py

from django.conf.urls import patterns, url

urlpatterns += patterns('',
    ...
    url(r'^pages(?P<url>.*)$', 'django.contrib.flatpages.views.flatpage', name='flatpage'),
    ...
)

Et maintenant, vous pouvez utiliser votre balise de modèle url inverse habituelle

<a href='{% url 'flatpage' url="/about-us/" %}'>About Us</a>

Ou pour afficher une liste de toutes les pages plates

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

approprié Django> = 1,10:

urls.py

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

recherche facile à l'intérieur du modèle:

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

où SOME_URL est la valeur du champ de frome flatpage.url

D'après cette documentation django flatpages

Vous pouvez simplement faire

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

Dans votre modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top