2013-08-15 3 views
2

models.pyDjango DetailView ne pas trouver l'objet basé sur SLUG

class Tag(models.Model): 
    name = models.CharField(max_length=64, unique=True)  
    slug = models.SlugField(max_length=255, unique=True) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     super(Tag, self).save(*args, **kwargs) 


urls.py

url(r'^tag/(?P<slug>[A-Za-z0-9_\-]+)/$', 
    TagDetailView.as_view(), 
    name='tag_detail'),  


views.py

class TagDetailView(DetailView): 
    model = Tag 
    template_name = 'tag_detail_page.html' 
    context_object_name = 'tag' 

Cela me donne une erreur 404:

Page not found (404) 
http://localhost:9999/tag/RandomTag/ 
No tag found matching the query 

Pourquoi Django ne parviennent pas à récupérer l'objet correct sur la base du champ slug?

Répondre

3

méthode de Django slugify:

conversion en minuscule, supprime les caractères non-mot (de caractères alphanumériques et caractères de soulignement) et transforme les espaces en traits d'union. Supprime également les espaces avant et arrière.

vous cherchez un tag Camel Case'd:

http://localhost:9999/tag/RandomTag/ 

vous devez utiliser les minuscules:

http://localhost:9999/tag/randomtag/ # or `random-tag` depending on the name 

Vérifiez votre DB pour voir exactement comment le slug est sauvé

0

La réponse de Timmy est correcte pour déterminer le problème - les minuscules sont en minuscules. Il vous suggère d'utiliser une URL en minuscule. Pas une mauvaise solution ... mais peut-être que vous aimez l'URL comme ça?

Si vous souhaitez que le slug soit insensible à la casse, définissez slug_field = 'slug__iexact' sur votre vue.

+0

Le slug est enregistré dans la base de données en minuscules car il est filtré via la fonction 'slugify'. Sauf si vous écrivez votre propre fonction slugify, elle sera toujours dans la base de données en minuscules, donc la modification de la requête n'aidera pas –

+0

Oui, le slug est en minuscules dans la base de données ... ** mais le slug de l'URL est évidemment 't **. Cela vous laisse deux choix: appelez 'str.lower()' sur le slug, ou faites une requête insensible à la casse. Bien que changer la casse sur la chaîne soit probablement meilleur pour DB, changer la requête pour être '__iexact' est trivial à écrire. – meshy

+0

... ou utilisez simplement la bonne limace à la première place bien sûr ... comme vous l'avez suggéré ';)' – meshy

Questions connexes