Comment puis-je obtenir l'url inverse pour un modèle Django Flatpages
-
16-09-2019 - |
Question
Comment puis-je obtenir l'URL inverse pour un modèle Django Flatpages
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.