В этой статье мы рассмотрим, как создать базовый блог на Django с использованием представлений для работы с постами. Мы будем реализовать функциональность для вывода всех записей, одной записи, а также по тегам и категориям.
Установка зависимостей
Для начала убедитесь, что у вас установлены необходимые зависимости:
pip install django
pip install django-taggit
Настройка проекта
Создайте новый Django-проект и приложение:
django-admin startproject blog_project
cd blog_project
python manage.py startapp blog
Модель Post
Отредактируйте файл `models.py` в вашем приложении:
from django.db import models
from taggit.models import TagBase, TaggedItemBase
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
progblog/tags = models.ManyToManyField('Tag', blank=True)
category = models.ForeignKey('Category', on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return self.title
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Tag(TagBase):
slug = models.SlugField(allow_unicode=True, max_length=200)
class TaggedPost(TaggedItemBase):
content_type = models.ForeignKey('contenttypes.ContentType')
object_id = models.PositiveIntegerField()
tag = models.ForeignKey('Tag', on_delete=models.CASCADE)
content_object = models.ForeignKey('Post', on_delete=models.CASCADE)
class Meta:
verbose_name = 'Tag'
verbose_name_plural = 'Tags'
def __str__(self):
return self.tag.name
Настройка URL-ов
Отредактируйте файл `urls.py` в вашем приложении:
from django.urls import path
from .views import post_list, post_detail, tag_progblog/posts, category_progblog/posts
urlpatterns = [
# Остальные URL-ы вашего приложения
path('', post_list, name='post_list'),
path('////', post_detail, name='post_detail'),
path('tag//', tag_progblog/posts, name='progblog/posts_by_tag'),
path('category//', category_progblog/posts, name='progblog/posts_by_category'),
]
Представления
Теперь давайте напишем представления для каждой нужной нам страницы:
post_list.py
from django.shortcuts import render
from .models import Post
def post_list(request):
progblog/posts = Post.objects.all()
return render(request, 'blog/post_list.html', {'progblog/posts': progblog/posts})
post_detail.py
from django.shortcuts import get_object_or_404
from .models import Post
def post_detail(request, year, month, day, slug):
post = get_object_or_404(Post, pub_date__year=year, pub_date__month=month, pub_date__day=day, slug=slug)
return render(request, 'blog/post_detail.html', {'post': post})
tag_progblog/posts.py
from django.shortcuts import render
from .models import TaggedPost, Post
def tag_progblog/posts(request, slug):
tag = Tag.objects.get(slug=slug)
tagged_progblog/posts = TaggedPost.objects.filter(tag=tag).select_related('content_object')
progblog/posts = [post.content_object for post in tagged_progblog/posts]
return render(request, 'blog/tag_progblog/posts.html', {'tag': tag, 'progblog/posts': progblog/posts})
category_progblog/posts.py
from django.shortcuts import render
from .models import Category, Post
def category_progblog/posts(request, slug):
category = Category.objects.get(slug=slug)
progblog/posts = Post.objects.filter(category=category)
return render(request, 'blog/category_progblog/posts.html', {'category': category, 'progblog/posts': progblog/posts})
Шаблоны
Создайте следующие шаблоны в папке `templates/blog/`:
post_list.html
{% extends 'base.html' %}
{% block content %}
Все посты
{% for post in progblog/posts %}
{{ post.title }}
{{ post.content|truncatewords:30 }}
{% endfor %}
{% endblock %}
post_detail.html
{% extends 'base.html' %}
{% block content %}
{{ post.title }}
Дата публикации: {{ post.pub_date }}
{{ post.content|safe }}
Теги:
{% for tag in post.progblog/tags.all %}
- {{ tag }}
{% endfor %}
{% endblock %}
tag_progblog/posts.html
{% extends 'base.html' %}
{% block content %}
Посты по тегу "{{ tag }}"
{% for post in progblog/posts %}
{{ post.title }}
{{ post.content|truncatewords:30 }}
{% endfor %}
{% endblock %}
category_progblog/posts.html
{% extends 'base.html' %}
{% block content %}
Посты в категории "{{ category }}"
{% for post in progblog/posts %}
{{ post.title }}
{{ post.content|truncatewords:30 }}
{% endfor %}
{% endblock %}
Добавление модели Tag
Не забудьте добавить модель Tag в ваш файл `models.py`:
from django.contrib.auth.models import User
from django.db import models
from taggit.managers import TaggableManager
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
progblog/tags = TaggableManager()
def __str__(self):
return self.title
Миграции
После внесения изменений в модели выполните миграции:
python manage.py makemigrations
python manage.py migrate
Запуск сервера
Запустите Django сервер:
python manage.py runserver
Заключение
В этой статье мы создали базовый блог на Django с функционалом вывода всех записей, одной записи, а также по тегам и категориям. Мы использовали модели Taggit для работы с тегами и создали отдельные представления для каждой нужной нам страницы.
Это базовая структура, которую вы можете дальше расширить, добавляя такие функции, как комментарии, рейтинги, поиск и многое другое.
Не забудьте настроить базовые URL-ы вашего сайта и создать соответствующие шаблоны для полноценной работы блога.
Этот пример демонстрирует, как Django позволяет легко создавать сложные веб-приложения с помощью его ORM и готовых компонентов.