首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Django urls中使用Slugify

在Django urls中使用Slugify
EN

Stack Overflow用户
提问于 2014-01-27 10:06:53
回答 2查看 3.9K关注 0票数 2

我试图创建SEO友好的urls,其中所有的空格被替换为连字符。

这就是我如何在Django模板中使用slugify来“解析”URL的方式。

代码语言:javascript
复制
<a href="{% url 'dj' dj_name=dj.name|slugify %}">

这是我的urls.py

代码语言:javascript
复制
url(r'^top100/(?P<dj_name>[a-zA-Z0-9 \'&-]+)/$', views.dj, name='dj')

这是我的观点

代码语言:javascript
复制
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}

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

这也忽略了DJ名称中的&。例如,它将DJ Above & Beyond的url更改为www.example.com/top100/above-beyond

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-27 10:19:12

您正在尝试请求一个对象,其中包含它的段塞,而不是它在数据库中的名称。段塞是一个字符串,根据原始名称计算,您可以在URL中使用它(因为它是SEO友好的)。但是,如果数据库中的任何地方都没有保存这段代码的话,就不能使用它来请求对象。事实上,从鼻涕虫中提取原始名字是不可能的。

代码语言:javascript
复制
Above & Beyond --> above-beyond --> Above @ Beyond  }
                                --> above & beyond  } A lot of possibilities...
                                --> ABOVE - BEYOND  } 
                                --> ...

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

代码语言:javascript
复制
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)

实际上,您可以使用templatetags,如果您想使用slugify这样的干净URL :他们使用问题的ID从URL检索内容,但是还有标题,您可以更改它,它无论如何都会重定向您。

代码语言:javascript
复制
http://stackoverflow.com/questions/21377984/using-slugify-in-django-urls
                                   ^^^^^^^^
                                   ID used  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                            slug just for SEO purpose, not
                                            used to retrieve from the db
票数 3
EN

Stack Overflow用户

发布于 2014-01-27 10:16:16

你为什么不在你的模型中使用SlugField()?然后你就可以用你的鼻涕虫来查询了。我想这个错误来自于名字上的查询集,而不是鼻涕虫。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21377984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档