Domanda

Come posso ottenere l'url inversa per un modello di Django Flatpages

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top