Подтвердить что ты не робот

Использовать slugify в шаблоне

Я хочу иметь SEO-friendly URL, мой текущий 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 to get новостной объект с этим PK. Я хочу преобразовать этот URL:

../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.

Я думаю, что этот question хорош, но я не знаю, как использовать news_id для извлечения моего news object

4b9b3361

Ответ 1

Это создаст необходимый URL:

{% 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)

UPDATE. Чтобы использовать символы unicode в slugify, вам сначала нужно преобразование. Посмотрите на это: Как сделать 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

Ответ 2

Вы пробовали n.title|slugify и видите, работает ли это для вас.

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

Примечание:, хотя это возможно, просто убедитесь, что элемент "slugified" никогда не используется для какой-либо части маршрутизации... (т.е. только для отображения)