Domanda

Sto cercando di aggiungere le lumache alla url nella mia Django app, proprio come lo fa.

Attualmente, ho le pagine che funzionano bene con un URL simile a questo:

http://example.com/foo/123/

Mi piacerebbe aggiungere gli url 'slugified' in questo modo:

http://example.com/foo/123/foo-name-here

posso farlo funzionare bene, semplicemente modificando l'urlconf e l'aggiunta di un valore usa e getta per la funzione di visualizzazione:

#urls.py

ulpatterns = patterns('project.app.views',
    url(r'^foo/(?P<foo_id>\d+)/(?P<name_slug>\w+)/$', 'foo_detail', name='foo_detail'),
)

#views.py:

def foo_detail(request, foo_id, name_slug):
    # stuff here, name slug is just discarded

rechino l'url con la lumaca funziona bene.

Tuttavia, il mio problema è quando sto usando @models.permalink.

Per il mio modello Foo, ho usato per avere la seguente, che ha lavorato bene:

@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id),])

Tuttavia, dopo il mio cambiamento, ogni volta che io chiamo {{ foo.get_absolute_url }} nei miei modelli, il risultato è sempre una stringa vuota.

Ho provato le seguenti due sostituzioni per get_absolute_url, nessuno dei quali sta lavorando:

from django.template.defaultfilters import slugify

# attempt 1
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', [str(self.id), slugify(self.name)])

# attempt 2
@models.permalink
def get_absolute_url(self):
    return ('foo_detail', (), {
        'foo_id': str(self.id), 
        'name_slug': slugify(self.name),
    })

Si noti che se aggiungo un print slugify(self.name) prima di tornare, il nome slugified sta rivelando nella console bene.

Quando si richiama {{ foo.get_absolute_url }} nei miei modelli, il risultato è sempre una stringa vuota, e non ho ricevuto alcun errore.

So che potrei sostituire il metodo con return '/foo/%s/%s' % (str(self.id), slugify(self.name)), ma sto cercando di ottenere il permalink lavoro in modo che il mio URL è definito solo in un posto. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Una cosa da controllare, perché anche io sono imbattuto in questo problema:

(?P<name_slug>\w+)

È slugify l'aggiunta di trattini da qualche parte? Se è così l'espressione regolare non corrisponderà, hypens sono un carattere non di parola. Per risolvere uso [\w-]+ o simili.

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