Человеко читабельные urls в Django 1.4

категория: Django
Наконец-то от Нового Года уже отошел :) Сегодня будут красивые юэрэлки. Мне они не нужны, мне лучше чтоб статьи были под номерами, но люди требуют :) В Django это оказалось довольно просто с использованием SlugField. Вставляем в нашу модель поле:
class Post(models.Model):
    ...
    slug_title = models.SlugField("Название для ссылки", unique=True, 
    help_text="Название для ссылки")
    ...
Параметр unique=True отвечает за то, чтоб название было уникальным. Следующим шагом будет подключение к админке. Чтобы вводить название статьи в поле title, и оно автоматически переводило на латиницу в slug_title, введем следующее в admin.py вашего приложения:
class PostAdmin(admin.ModelAdmin):
    ...
    prepopulated_fields = {'slug_title':('title',)}
    ...
Не забудьте сделать south миграцию, если база данных не пустая. Можете зайти в админку глянуть, какая это классная штука - slug. Прописываем url для нашей статьи в urls.py:
urlpatterns = patterns('blog.views',
    url(r'^blog/(.*)/$', post_detail, name='post_detail',),
Регулярное выражение '^(.*)$' обозначает любые символы. А теперь добрались и до представления. Будем вытягивать всю информацию о статье по slug_title в переменную post c фильтром по полю show:
def post_detail(request, slug_title):
    return render(request, "post_detail.html", {
        "post": get_object_or_404(Post, slug_title = slug_title, show = True),
    })
Выводим всю эту красоту в post_detail.html. Шаблончик должен получиться что-то типа этого:
{% extends "base.html" %}
{% block content %}
    <h2>{{ post.title }}</h2>
    Дата создания: {{ post.created }} Категория: {{ post.category }}
    {{ post.text|safe|linebreaks }}
{% endblock content %}
Пока что все, но думаю в дальнейшем перепишу все с помощью Clas-based generic views. Да и вообще это отдельная тема.


blog comments powered by Disqus