Как сделать блог на Django 1.8 от начала и до конца
Михаил Попов 30.10.2015 22:21 Python , Модели , Практикум Django нет комментариевВыполняю лабораторную работу практикума по полям моделей. Создаю модели и их представление. Эта лабораторная работа, похоже уже по традиции, рождает в результате выполнения блог. Мы делаем Блог, а значить нам нужно отображать статьи в блоге, которые будут отображаться в списке. В списке должны отображаться: - Заголовок статьи
- Дата создания статьи
- Краткий текст статьи
- Кнопка перехода к полной версии статьи
Похоже, что ничего не забыл. Еще я хочу, чтобы ссылки на мои статьи выглядели читабельно, для этого мне нужно из названия статьи делать транслит в английский язык и делать из этого ссылку. Но обо всем по порядку.
Первым делом нам понадобится модель (в текстах модулей я немного не соблюдаю 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 |