Как сделать блог на Django 1.8 от начала и до конца

    30.10.2015 22:21    Python , Модели , Практикум Django     нет комментариев

Как сделать блог на Django 1.8Выполняю лабораторную работу практикума по полям моделей. Создаю модели и их представление. Эта лабораторная работа, похоже уже по традиции, рождает в результате выполнения блог. Мы делаем Блог, а значить нам нужно отображать статьи в блоге, которые будут отображаться в списке. В списке должны отображаться: - Заголовок статьи
- Дата создания статьи
- Краткий текст статьи
- Кнопка перехода к полной версии статьи

Похоже, что ничего не забыл. Еще я хочу, чтобы ссылки на мои статьи выглядели читабельно, для этого мне нужно из названия статьи делать транслит в английский язык и делать из этого ссылку. Но обо всем по порядку.

Первым делом нам понадобится модель (в текстах модулей я немного не соблюдаю PEP8, чтобы сократить лишние строчки, я это делаю для вашего удобства - вам меньше крутить колесиком мыши или двигать пальцем по экрану). Ну собственно, модуль models.py:

# coding: utf-8
from django.db import models
from base.models import Record
from uuslug import slugify # Это библиотека для преобразования заголовков в ссылки django-uuslug

class Article(Record):
    class Meta:
        db_table = 'app_blog_article'
        ordering = ['-add_date']

    title = models.CharField(verbose_name='Заголовок', max_length=200)
    add_date = models.DateTimeField(verbose_name="Дата создания", auto_now_add=True)
    upd_date = models.DateTimeField(verbose_name="Дата изменения", auto_now=True)
    text = models.TextField(verbose_name="Текст статьи", blank=True)
    slug = models.CharField(verbose_name='Транслит', max_length=200, blank=True) # Поле для записи ссылки

    def __unicode__(self):
        return self.title
    
    def save(self):
        self.slug = '{0}-{1}'.format(self.pk, slugify(self.title)) # Статья будет отображаться в виде NN-АА-АААА
        super(Article, self).save()

Стоит оговориться, что я использую класс не в таком виде, а дополнительно использую абстрактный класс, в котором содержатся поля title, add_date, upd_date, но для простоты, в статье я его не показываю. Кажется, что тут все вполне понятно, если кому не понятно, отписывайте в комментах, поясню.
Поехали дальше. Теперь нам бы хорошо вывести список всех статей и одной статьи. Для этого определим 2 метода в модуле views.py:

# coding: utf-8
from django.shortcuts import render, render_to_response, get_object_or_404, RequestContext
from blog.models import Article

def all_articles(request):
    articles = Article.objects.all()
    return render_to_response('all_articles.html', {'articles': articles}, context_instance=RequestContext(request))

def one_article_by_slug(request, slug):
    article = get_object_or_404(Article, slug=slug)
    return render(request, 'one_article.html', {'article': article}, context_instance=RequestContext(request))

Наверно тут понятно, что у нас есть 2 метода. Один метод all_articles вернет нам рендер всех статей, второй метод one_article_by_slug вернет нам одну статью по значению поля slug. Теперь нужно определить, как у нас будут выглядеть ссылки.
Для списка всех статей вроде как ничего сложного, а вот для отдельных статей придется попариться, т.к. нам нужно регулярное выражение, но воспользовавшись этим сервисом, я легко его подобрал, понимая что мне нужно. А мне нужна строка вида {цифры}-{буквы и тире}. Моему шаблону вполне соответствует выражение: d+-S+. Соберем все это в модуль urls.py:

# coding: utf-8
from django.conf.urls import url
from blog.views import all_articles, one_article, one_article_by_slug

urlpatterns = [
    url(r'^$', all_articles),
    url(r'^(?P<slug>d+-S+)/$', one_article_by_slug)
]

Собственно нам осталось определиться с шаблонами. Их у нас должно быть 2: Один для всех статей и второй для одной статьи. В шаблонах я использую зависимость от базовой страницы для простоты. Посмотрим на наши шаблоны.
Шаблон all_articles.html для вывода списка статей:

{% extends 'base.html' %}
{% block content %}
{% load bootstrap3 %}
<div>
{% for art in articles %}
    <h3><a href="/blog/{{ art.slug }}/">{{ art.title }}</a></h3>
    <small>Автор: <ins>Михаил Попов</ins> / Дата: <ins>{{ art.add_date|date:"d.m.Y" }} </ins> в <ins>{{ art.add_date|time:"H:i" }}</ins> </small><br>
    {{ art.text }}<br><br>
    <a class="btn btn-default btn-xs" type="button" href="/blog/{{ art.slug }}/">Читать статью полностью...</a>
{% endfor %}
</div>
{% endblock %}

Тут понятно, что происходит: выводим в цикле заголовок, автора, дату, время и текст статьи. В низу статьи выводится кнопка с ссылкой на страницу статьи.
И в финале шаблон отдельной статьи, пока совсем простенький файл one_article.htm:

{% extends 'base.html' %}
{% block content %}
<div>
    <h3>{{ article.title }}</h3>
    {{ article.text }}
</div>
{% endblock %}

Ну вот и все. Надеюсь в последующих уроках будет рассказываться, как сделать краткий вывод статьи в списке, чтобы не отображать весь текст статьи на странице со всеми статьями. Также надеюсь, что будет про пагинацию, чтобы можно было выводить статьи быстро, хотя сейчас другой тренд - бесконечная прокрутка, но я пока к этому не готов))).  Ну и еще хочется картинки научиться вставлять и писать текст не как эта статья, а покрасивее. (Да, я уже написал об этом статью, во ссылка на нее - Как сделать блог на Django 1.8 от начала и до конца (часть 2)). Пожалейте меня. В этой статье мне пришлось прописывать все теги руками. Ну а пока что - пока. Да, чуть не забыл, нужно еще вставить социальные кнопки и возможность комментирования, но об этом в следующей статье. До встречи на страницах моего блога и практикума. если хотите изучить Python и Django, приходите учиться в spb-tut.ru.

Как сделать блог на Django 1.8 от начала и до конца (часть 2) Решено, я создам свой блог

0     0

blog comments powered by Disqus