J'essaye d'ajouter des slugs à l'URL dans mon application django, un peu comme le fait SO. ActuellementDjango - comment puis-je faire permalink pour travailler avec le slug "throwaway"
, j'ai des pages qui fonctionnent très bien avec une URL comme ceci:
http://example.com/foo/123/
Je voudrais ajouter 'slugified' urls comme ceci:
http://example.com/foo/123/foo-name-here
je peux l'obtenir travailler très bien, en modifiant simplement le URLconf et en ajoutant une valeur à la fonction jetable de vue:
#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
visitiez l'url avec t La limace fonctionne très bien.
Cependant, mon problème est quand j'utilise @models.permalink
.
Pour mon modèle Foo
, je l'habitude d'avoir les éléments suivants, qui fonctionnait très bien:
@models.permalink
def get_absolute_url(self):
return ('foo_detail', [str(self.id),])
Cependant, après mon changement, chaque fois que j'appelle {{ foo.get_absolute_url }}
dans mes modèles, le résultat est toujours une chaîne vide.
J'ai essayé les deux suivants pour le remplacement get_absolute_url
, dont aucun ne travaille:
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),
})
Notez que si j'ajouter un print slugify(self.name)
avant de revenir, le nom slugified affiche dans la console très bien.
Lorsque j'appelle {{ foo.get_absolute_url }}
dans mes modèles, le résultat est toujours une chaîne vide et je n'obtiens aucune erreur.
Je sais que je pourrais remplacer la méthode par return '/foo/%s/%s' % (str(self.id), slugify(self.name))
, mais j'essaye de faire fonctionner le permalink pour que mon URL ne soit définie qu'à un endroit. Qu'est-ce que je fais mal?
Je devrais noter que la façon dont je faisais ceci est assez bizarre et inutile: il n'y a aucune raison que je devais garder 'name_slug' dans la fonction urlconf ou la vue. Après que le répondant a signalé mon problème, j'ai pu revenir à 'r '^ foo/(? P \ d +)/([\ w -] +)/$'' et 'foo_detail (request, foo_id):' respectivement, ce qui est plus propre. –
quelle méthode permalink avez-vous utilisé? Je regarde la même chose ... – thornomad
La tentative #thornomad # 1 dans ma question était ce que j'ai fini avec. Il s'avère qu'il n'y avait aucun problème avec les méthodes 'get_absolute_url' que j'avais, juste avec mon modèle d'URL. –