Использовать 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
Ответы
Ответ 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" никогда не используется для какой-либо части маршрутизации... (т.е. только для отображения)