2009-10-15 3 views
4

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?

+1

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. –

+0

quelle méthode permalink avez-vous utilisé? Je regarde la même chose ... – thornomad

+0

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. –

Répondre

7

Une chose à vérifier, parce que je aussi rencontré ce problème:

(?P<name_slug>\w+) 

est-il slugify partout ajoutant des traits d'union? Si c'est le cas, l'expression régulière ne correspondra pas, les hypers sont des caractères non-mots. Pour corriger l'utilisation [\w-]+ ou similaire.

+0

Ahh, bonne prise, oui, slugify ajoute définitivement des traits d'union –

Questions connexes