在模板中使用slugify

Asm*_*ari 11 python django django-templates

我想要SEO-friendly URL,我现在的网址urls.py:

(ur'^company/news/(?P<news_title>.*)/(?P<news_id>\d+)/$','CompanyHub.views.getNews')
Run Code Online (Sandbox Code Playgroud)

我在模板中使用它:

{% for n in news %}
     <a href="{% url CompanyHub.views.getNews n.title,n.pk %}" >{{n.description}}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我用它news_id来对get新闻对象PK.我想转换这个网址:

../company/news/tile of news,with comma/11
Run Code Online (Sandbox Code Playgroud)

至:

../company/news/tile-of-news-with-comma/11
Run Code Online (Sandbox Code Playgroud)

通过在模板中做这样的事情:

{% for n in news %}
      <a href="{% url CompanyHub.views.getNews slugify(n.title),n.pk %}" >{{n.description}}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我检查了这些问题: question1 question2 question3和这篇文章,但他们保存slugify field在数据库中,而我想要按需生成它.另外我想运行查询news_id.

我认为这个问题很好,但我不知道怎么news_id用来取我的news object

Tis*_*sho 10

这将生成所需的URL:

{% for n in news %}
      <a href="{% url CompanyHub.views.getNews n.title|slugify n.pk %}" >{{n.description}}</a>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

以上示例保存slugify_field在数据库中,因为它们稍后会搜索它.否则,在数据库中,你将拥有一个普通的标题,并在代码中用于搜索的标题.没有简单的方法来比较它们.但你解释的方式更简单.你会有这样的观点:

def news(request, slug, news_id):
    news = News.objects.filter(pk=news_id)
Run Code Online (Sandbox Code Playgroud)

更新:要在slugify中使用unicode符号,首先需要转换.看看这个:如何让Django slugify与Unicode字符串一起正常工作?.它使用Unidecode

然后添加自定义过滤器:

from unidecode import unidecode
from django.template.defaultfilters import slugify

def slug(value):
    return slugify(unidecode(value))

register.filter('slug', slug)
Run Code Online (Sandbox Code Playgroud)

然后在你的模板中使用这个:

{% load mytags %}
<a href="{% url CompanyHub.views.getNews n.title|slug n.pk %}
Run Code Online (Sandbox Code Playgroud)

这是一个例子:

{{ "??? 1 2 3"|slug}}
Run Code Online (Sandbox Code Playgroud)

呈现为:

ying-shi-ma-1-2-3
Run Code Online (Sandbox Code Playgroud)


Jon*_*nts 7

你有没有试过n.title|slugify,看看它是否适合你.

参考:https://docs.djangoproject.com/en/dev/ref/templates/builtins/? from = olddocs# slugify

注意:虽然这是可能的,但只要确保'slugified'元素永远不会用于路由的任何部分...(即,纯粹仅用于显示)