【问题标题】:Using Slugify in Django urls在 Django url 中使用 Slugify
【发布时间】:2014-02-18 02:55:26
【问题描述】:

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

这就是我在 Django 模板中使用 slugify 对 URL 进行“slugifying”的方式

<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 名称中的 &amp;。例如,它将 DJ 的网址 Above &amp; Beyond 更改为 www.example.com/top100/above-beyond

【问题讨论】:

    标签: python django slug


    【解决方案1】:

    您正在尝试使用其 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,你可以使用模板标签 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
    

    【讨论】:

    • @Maxime - 我必须说很好的解释。我有一个疑问。从news = get_object_or_404(News, slug=slug) 这样的模型中获取新闻对象时,不会查询slug 字段需要很多时间吗?我的意思是它没有被索引,即使我们索引它,写查询也会很繁重。不是吗?如果我错了,请纠正我。
    • @PythonEnthusiast 如果我没记错我的数据库研究生课程,索引字符串使用 B 树索引中的哈希。因此,与整数相比,它增加了计算哈希的相对较小的成本。但是,如果您不在slug 字段上放置索引,那么当您的表获得(数十个?)数千个条目时,它确实比查询主键慢得多。但这是另一个问题,你应该知道你的数据库何时开始变得比一个少于 100 个条目的休闲博客更大。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 2013-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-19
      • 2021-09-18
      • 2013-05-17
      • 2011-08-08
      • 2018-05-04
      相关资源
      最近更新 更多