在Django网址中使用Slugify

时间:2014-01-27 10:06:54

标签: python django slug

我正在尝试创建SEO友好的网址,其中所有空格都用连字符替换。

这就是我在Django模板中使用slugify来强化网址的方法

<a href="{% url 'dj' dj_name=dj.name|slugify %}">

这是我的urls.py

url(r'^top100/(?P<dj_name>[a-zA-Z0-9 \'&-]+)/$', views.dj, name='dj')

这是我的观点

def dj(request, dj_name):
    dj = DJ.objects.get(name=dj_name)
    dj_song_list = Song.objects.filter(artist=dj, duplicate=False).order_by('-votes', '-release_date')
    return render(request, 'hunt/dj.html', {'dj_song_list': dj_song_list, 'dj':dj}

现在,网址中的%20已更改为-但我收到错误DJ matching query does not exist.

此外,这会忽略DJ名称中的&。例如,它会将DJ Above & Beyond的网址更改为www.example.com/top100/above-beyond

2 个答案:

答案 0 :(得分:3)

您尝试使用其slug而不是数据库中的名称来请求对象。 slug是一个字符串,从原始名称计算,你可以在URL中使用(因为它是SEO友好的)。但是,如果您没有在数据库中的任何位置保存此slug,则无法使用它请求对象。实际上,不可能从slug中检索原始名称。

Above & Beyond --> above-beyond --> Above @ Beyond  }
                                --> above & beyond  } A lot of possibilities...
                                --> ABOVE - BEYOND  } 
                                --> ...

您需要使用SlugField()并根据此新字段获取所需的对象。简短的例子:

class News(models.Model):
    title = models.CharField('title', max_length=100)
    slug = models.SlugField('slug', max_length=100, unique=True)
    content = models.TextField('news content')

    def get_absolute_url(self):
        return reverse('news-view', args=(self.slug, ))

# In the app/urls.py:
from . import views
urlpatterns = [
    url(r'^(?P<slug>.+)/$', view.news_detail, name='news-view'),
    #...
]

# In the 'news_detail' view (app/views.py)
news = get_object_or_404(News, slug=slug)

实际上,如果你想使用像stackoverflow这样的干净URL,你可以使用templatetags slugify:他们使用问题的ID从URL中检索内容,但也有标题,你可以改变,无论如何它会重定向你。

http://stackoverflow.com/questions/21377984/using-slugify-in-django-urls
                                   ^^^^^^^^
                                   ID used  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                            slug just for SEO purpose, not
                                            used to retrieve from the db

答案 1 :(得分:0)

为什么不在模特中使用SlugField()? 然后你可以在你的slug上查询。 我猜这个错误来自于名称而不是slug的查询集。