2013-08-15 2 views
2

models.pyДжанго DetailView неспособность найти объект на основе 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' 

Это дает мне 404:

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

Почему Django не извлечь правильный объект, основанный на поле слизняка?

ответ

3

slugify метод Джанго:

Преобразует в нижний регистр, удаляет несловообразующим символы (буквенно-цифровых символов и знаков подчеркивания) и преобразует пробелы в дефисы. Также разделяет ведущие и конечные пробелы.

вы ищете тег Camel Case'd:

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

вам нужно использовать строчные буквы:

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

Проверьте DB, чтобы увидеть, как именно slug сохраняется

0

Ответ Тимми правилен в определении проблемы - пули строчные. Он предлагает использовать нижний регистр. Неплохое решение ... но, возможно, вам нравится этот url?

Если вы хотите слизняк быть чувствительны к регистру, установите slug_field = 'slug__iexact' на ваш взгляд.

+0

Пульс сохраняется в БД как строчный, поскольку он фильтруется через функцию 'slugify'. Если вы не напишете свою собственную функцию 'slugify', она всегда будет в DB как строчная, поэтому изменение запроса не поможет –

+0

Да, slug является строчным в DB ... **, но slug из URL, очевидно, не является «т **. Это оставляет вам два варианта: вызовите 'str.lower()' в slug или сделайте запрос, нечувствительный к регистру. Хотя изменение случая в строке, вероятно, лучше для БД, изменение запроса на '__iexact' является тривиальным для записи. – meshy

+0

... или просто используйте правильный пул в первую очередь, конечно ... как вы предложили ';)' – meshy