Come posso ottenere l'url inversa per un modello di Django Flatpages
-
16-09-2019 - |
Domanda
Come posso ottenere l'url inversa per un modello di Django Flatpages
Soluzione
Includi flatpages nel urlconf root:
from django.conf.urls.defaults import *
urlpatterns = patterns('',
('^pages/', include('django.contrib.flatpages.urls')),
)
Quindi, a suo avviso si può chiamare invertire in questo modo:
from django.core.urlresolvers import reverse
reverse('django.contrib.flatpages.views.flatpage', kwargs={'url': '/about-us/'})
# Gives: /pages/about-us/
In modelli, utilizzare il tag {% url%} (che chiama inversa internamente):
<a href='{% url django.contrib.flatpages.views.flatpage url="/about-us/" %}'>About Us</a>
Altri suggerimenti
Io preferisco la seguente soluzione (richiedo 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'),
)
nei modelli
[...]
<a href="{% url about %}"><span>{% trans "About us" %}</span></a>
<a href="{% url license %}"><span>{% trans "Licensing" %}</span></a>
[...]
O nel codice
from django.core.urlresolvers import reverse
[...]
reverse('license')
[...]
In questo modo non è necessario utilizzare django.contrib.flatpages.middleware.FlatpageFallbackMiddleware
e il contrario funziona come al solito senza scrivere codice così tanto come nelle altre soluzioni.
Saluti.
Sono d'accordo con Anentropic che non v'è alcun punto nel usando Django Flatpages se avete bisogno di scrivere urlconfs da impiegare loro. E 'molto più semplice da usare viste generiche quali TemplateView
direttamente:
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 usufruire di FlatpageFallbackMiddleware
, che cattura 404 errori e cerca di trovare contenuti per URL richiesto nel database. Il vantaggio principale è che non c'è bisogno di toccare i modelli direttamente ogni volta che si deve cambiare qualcosa in loro, il lato negativo è la necessità di utilizzare un database:)
Se si sceglie di utilizzare ancora Flatpages app, è meglio tag template uso get_flatpages
:
{% load flatpages %}
<ul>
{% for page in get_flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Personalmente, io raramente riferisco flatpages al di fuori del menu principale del sito, che è incluso con {% include 'includes/nav.html' %}
e si presenta così:
<ul>
<li><a href="/about/">About</a></li>
<li><a href="/credits/">Credits</a></li>
...
</ul>
Non mi sento di violare qualsiasi BACIO A SECCO o qualcosa del genere:)
Scrivi i tuoi URL di base conf per puntare ai vostri flatpages. Si supponga che è in fase di pagine:
urlpatterns = patterns('',
...
url(r'^pages/', include('project.pages.urls')),
...
)
quindi scrivere la flatpages come normale:
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'),
)
Poi il modello si riferisce solo a loro nel modo consueto:
<div id="pages">
...
<div class="pagelinks">
<a href="{% url about %}">ABOUT</a>
</div>
</div>
ho pensato che il vantaggio di Flatpages era voi non ha dovuto creare alcun stub vista o confs URL? E 'un po' inutile altrimenti ... se si sta creando viste e URL si può anche salvare il contenuto flatpage come modello HTML, invece.
Prova a modificare: https://github.com/0sn/nameremoved/wiki/flatpages
Quando si crea alcun flatpage, è necessario specificare un URL che viene salvato come parte del modello. Da qui è possibile recuperare l'URL da qualsiasi oggetto flatpage. In un modello:
{{ flatpage.url }}
Riassegnazione URL flatpage in urls.py
e poi dover utilizzare inverso sorta di sconfigge lo scopo dell'app flatpages.
Nessuna delle soluzioni di cui ha seguito sufficientemente il principio DRY, a mio parere, quindi ho solo fatto questo:
# 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
Quindi in qualsiasi modello che ha bisogno di fare un collegamento, ho fatto questo:
{% load hacks %}
...
<a href="{% flaturl 'My Page Title' %}">Page Title</a>
mi permetto di aggiungere un po 'di memorizzazione nella cache in lì per mantenere le prestazioni, ma questo funziona per me.
È necessario ridichiarare la conf URL e non può fare affidamento sul 'django.contrib.flatpages.urls'
ufficiale che il documento sta incoraggiando noi da usare.
Questo non sarà più difficile, basta includere nel vostro urls.py
from django.conf.urls import patterns, url
urlpatterns += patterns('',
...
url(r'^pages(?P<url>.*)$', 'django.contrib.flatpages.views.flatpage', name='flatpage'),
...
)
E ora si può utilizzare il consueto tag modello inverso url
<a href='{% url 'flatpage' url="/about-us/" %}'>About Us</a>
o per visualizzare un elenco di tutte le pagine piatte
<ul>
{% get_flatpages as flatpages %}
{% for page in flatpages %}
<li><a href="{% url 'flatpage' url=page.url %}">{{ page.title }}</a></li>
{% endfor %}
</ul>
corretta Django> = 1.10:
urls.py
urlpatterns += [
url(r'^(?P<url>.*/)$', flatpage, name='flatpage'),
]
semplice ricerca all'interno del template:
{% url "flatpage" url="SOME_URL" %}
dove some_url è il valore frome campo flatpage.url
In base a questo documentazione Django per flatpages
Si può semplicemente fare
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Nel modello.