Евгений Онегин

Блог на Django

17 сентября 2024 г. 16:53Время на чтение: 6 мин
image

В этой статье мы рассмотрим, как создать базовый блог на 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 %} {% 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 %} {% endfor %} {% endblock %}

category_progblog/posts.html


{% extends 'base.html' %}

{% block content %}
  

Посты в категории "{{ category }}"

{% for post in progblog/posts %} {% 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 и готовых компонентов.

На главную
Выберите тему