14

我想拥有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和这篇文章,但他们保存了一个slugify field数据库,而我想按需生成它。此外,我想通过news_id.

我认为这个问题很好,但我不知道如何使用news_id来获取我的news object

4

2 回答 2

13

这将生成所需的 url:

{% for n in news %}
      <a href="{% url CompanyHub.views.getNews n.title|slugify n.pk %}" >{{n.description}}</a>
{% endfor %}

上面的示例保存slugify_field在数据库中,因为他们稍后会搜索它。否则,在数据库中,您将有一个正常的标题,并在代码中使用 slugified 标题进行搜索。没有简单的方法来比较它们。但是你解释的方式更简单。你会有这样的看法:

def news(request, slug, news_id):
    news = News.objects.filter(pk=news_id)

更新:要在 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)

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

{% load mytags %}
<a href="{% url CompanyHub.views.getNews n.title|slug n.pk %}

这是一个例子:

{{ "影師嗎 1 2 3"|slug}}

呈现为:

ying-shi-ma-1-2-3
于 2012-07-12T17:03:35.717 回答
8

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

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

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

于 2012-07-12T15:58:26.593 回答