我想要SEO-friendly URL
,urls.py
中的当前网址:
(ur'^company/news/(?P<news_title>.*)/(?P<news_id>\d+)/$','CompanyHub.views.getNews')
我在模板中使用它:
{% for n in news %}
<a href="{% url CompanyHub.views.getNews n.title,n.pk %}" >{{n.description}}</a>
{% endfor %}
我将news_id
用于get
新闻对象PK
。
我想转换这个网址:
../company/news/tile of news,with comma/11
为:
../company/news/tile-of-news-with-comma/11
在模板中做这样的事情:
{% for n in news %}
<a href="{% url CompanyHub.views.getNews slugify(n.title),n.pk %}" >{{n.description}}</a>
{% endfor %}
我查看了这些问题:
question1
question2
question3以及此article但我们在数据库中保存slugify field
,而我想按需生成它。此外,我想通过news_id
运行查询。
我认为question很好,但我不知道如何使用news_id
来抓取news object
答案 0 :(得分:10)
这将生成所需的网址:
{% for n in news %}
<a href="{% url CompanyHub.views.getNews n.title|slugify n.pk %}" >{{n.description}}</a>
{% endfor %}
上面的示例将slugify_field
保存在数据库中,因为它们稍后会搜索它。否则,在数据库中,你将拥有一个普通的标题,并在代码中用于搜索的标题。没有简单的方法来比较它们。但你解释的方式更简单。你会有这样的观点:
def news(request, slug, news_id):
news = News.objects.filter(pk=news_id)
更新:要在slugify中使用unicode符号,您首先需要转换。看看这个:How to make Django slugify work properly with Unicode strings?。它使用Unidecode库
然后添加自定义过滤器:
from unidecode import unidecode
from django.template.defaultfilters import slugify
def slug(value):
return slugify(unidecode(value))
register.filter('slug', slug)
然后在你的模板中使用:
{% load mytags %}
<a href="{% url CompanyHub.views.getNews n.title|slug n.pk %}
以下是一个例子:
{{ "影師嗎 1 2 3"|slug}}
呈现为:
ying-shi-ma-1-2-3
答案 1 :(得分:7)
您是否尝试过n.title|slugify
,看看它是否适合您。
参考:https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#slugify
注意:虽然这是可能的,但请确保'slugified'元素永远不会用于路由的任何部分...(即,纯粹仅用于显示)