Django - come posso ottenere permalink lavorare con lumaca “usa e getta”
-
21-09-2019 - |
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?
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.