Создания простых страниц с возможностью добавления и редактирования через админпанель в Django 5
Для создания простых страниц с возможностью добавления и редактирования через админпанель в Django 5, а также автоматического формирования URL с опцией задания вручную, можно использовать несколько шагов. Вот пошаговая инструкция:
1. Создайте модель для страниц
Создадим модель Page
, которая будет содержать поля для заголовка, контента, URL и других необходимых данных.
# app/models.py
from django.db import models
from django.utils.text import slugify
from transliterate import translit
class Page(models.Model):
title = models.CharField("Заголовок", max_length=255)
content = models.TextField("Содержание", blank=True)
slug = models.SlugField("URL", max_length=255, unique=True, blank=True)
def save(self, *args, **kwargs):
# Автоматически генерируем slug, если он не задан
if not self.slug:
# Транслитерация заголовка и slugify для получения URL
self.slug = slugify(translit(self.title, 'ru', reversed=True))
super().save(*args, **kwargs)
def __str__(self):
return self.title
Эта модель будет содержать:
title
— заголовок страницы.content
— содержимое страницы.slug
— URL, который будет формироваться автоматически, если его не указать вручную.
2. Зарегистрируйте модель в админпанели
Чтобы иметь возможность добавлять и редактировать страницы, нужно зарегистрировать модель в админпанели Django.
# app/admin.py
from django.contrib import admin
from .models import Page
@admin.register(Page)
class PageAdmin(admin.ModelAdmin):
list_display = ("title", "slug")
prepopulated_fields = {"slug": ("title",)} # Автозаполнение slug из title
3. Настройте маршрутизацию (urls.py)
Теперь добавим URL-маршруты для страниц. Сделаем универсальный маршрут, который будет находить страницы по slug
.
# app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('<slug:slug>/', views.page_detail, name='page_detail'), # Общий путь для страниц
]
4. Создайте представление для отображения страниц
Создадим функцию page_detail
, которая будет получать страницу по slug
и отображать её.
# app/views.py
from django.shortcuts import get_object_or_404, render
from .models import Page
def page_detail(request, slug):
page = get_object_or_404(Page, slug=slug)
return render(request, 'page_detail.html', {'page': page})
5. Создайте шаблон для страниц
В шаблоне page_detail.html
отобразим содержимое страницы.
<!-- templates/page_detail.html -->
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>{{ page.title }}</title>
</head>
<body>
<h1>{{ page.title }}</h1>
<div>{{ page.content|safe }}</div>
</body>
</html>
6. Вывод ссылок на страницы в шаблоне
Чтобы вывести ссылки на все созданные страницы, можно сделать так:
- В представлении добавьте запрос для получения всех страниц:
# app/views.py
def page_list(request):
pages = Page.objects.all()
return render(request, 'page_list.html', {'pages': pages})
2. В шаблоне page_list.html
отобразите список страниц:
<!-- templates/page_list.html -->
<ul>
{% for page in pages %}
<li><a href="{% url 'page_detail' page.slug %}">{{ page.title }}</a></li>
{% endfor %}
</ul>
7. Настройте URL для списка страниц
Чтобы сделать доступ к списку страниц, добавьте маршрут в urls.py
:
# app/urls.py
from . import views
urlpatterns = [
path('', views.page_list, name='page_list'), # Список страниц
path('<slug:slug>/', views.page_detail, name='page_detail'), # Детальная страница
]
8. Установите библиотеку для транслитерации (если не установлена)
Для транслитерации можно использовать пакет transliterate
:
pip install transliterate
Теперь вы сможете добавлять и редактировать страницы через админпанель, а URL будет автоматически формироваться на основе заголовка страницы с возможностью ручного изменения.
Если вы хотите, чтобы была возможность прописать ссылки самостоятельно, а так же по умолчанию они должны заполнятся сами транслитерацией исходя из названия.
Для автоматической генерации URL на основе заголовка страницы с возможностью редактирования вручную, нужно немного изменить метод save
в модели Page
. Мы добавим проверку, чтобы slug
заполнялся автоматически только в том случае, если он не был указан вручную. Таким образом, администратор сможет прописать URL самостоятельно, если это необходимо.
1. Обновите метод save
в модели Page
Измените метод save
так, чтобы он проверял наличие slug
и только при его отсутствии генерировал его автоматически на основе транслитерации заголовка.
# app/models.py
from django.db import models
from django.utils.text import slugify
from transliterate import translit
class Page(models.Model):
title = models.CharField("Заголовок", max_length=255)
content = models.TextField("Содержание", blank=True)
slug = models.SlugField("URL", max_length=255, unique=True, blank=True)
def save(self, *args, **kwargs):
# Проверяем, установлен ли slug вручную
if not self.slug:
# Транслитерация заголовка и slugify для создания URL
self.slug = slugify(translit(self.title, 'ru', reversed=True))
super().save(*args, **kwargs)
def __str__(self):
return self.title
2. Настройте отображение в админпанели
В админпанели prepopulated_fields
может помочь автоматически заполнять slug
при вводе title
, но при этом администратор может вручную изменить slug
, если это необходимо. Если slug
не указан, save
автоматически добавит его.
# app/admin.py
from django.contrib import admin
from .models import Page
@admin.register(Page)
class PageAdmin(admin.ModelAdmin):
list_display = ("title", "slug")
# Это позволяет автоматически заполнить slug при вводе заголовка, но остается возможность редактировать его
prepopulated_fields = {"slug": ("title",)}
- По умолчанию: Если
slug
пустой, он будет автоматически сгенерирован из транслитерацииtitle
. - Вручную: Если
slug
задан вручную, он не будет перезаписываться при сохранении.
Теперь, добавляя или редактируя страницу в админпанели, можно:
- Либо указать
slug
самостоятельно. - Либо оставить его пустым, и он сгенерируется автоматически.
Если нужно оставить поле пустым для главной страницы или оставить возможность указать, что страница — главная.
Для того чтобы задать главную страницу с URL "/"
, можно использовать специальное условие в методе save
или создать отдельную проверку в представлениях и маршрутах. Сейчас мы рассмотрим оба подхода.
Подход 1: Установите поле slug
пустым для главной страницы и добавьте обработку в маршрутах и представлениях
- Сделайте
slug
необязательным в модели. Еслиslug
пустой, это будет означать, что страница является главной.
# app/models.py
from django.db import models
from django.utils.text import slugify
from transliterate import translit
class Page(models.Model):
title = models.CharField("Заголовок", max_length=255)
content = models.TextField("Содержание", blank=True)
slug = models.SlugField("URL", max_length=255, unique=True, blank=True, null=True)
def save(self, *args, **kwargs):
if not self.slug:
# Если заголовок - "Главная", оставляем slug пустым
if self.title.lower() == "главная":
self.slug = ""
else:
# Транслитерация заголовка и slugify для создания URL
self.slug = slugify(translit(self.title, 'ru', reversed=True))
super().save(*args, **kwargs)
def __str__(self):
return self.title
2. Настройте маршруты (urls.py). Добавьте отдельный маршрут для главной страницы, который будет рендерить страницу с пустым slug
.
# app/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home_page, name='home_page'), # Маршрут для главной страницы
path('<slug:slug>/', views.page_detail, name='page_detail'), # Остальные страницы
]
3. Обновите представления. Создайте представление для главной страницы, чтобы оно находило страницу с пустым slug
в базе данных.
# app/views.py
from django.shortcuts import get_object_or_404, render
from .models import Page
def home_page(request):
# Ищем страницу с пустым slug (главная страница)
page = get_object_or_404(Page, slug="")
return render(request, 'page_detail.html', {'page': page})
def page_detail(request, slug):
page = get_object_or_404(Page, slug=slug)
return render(request, 'page_detail.html', {'page': page})
Подход 2: Явно задать slug="home"
и перенаправлять URL /
на эту страницу
Если хотите, чтобы slug
не оставался пустым, можно задать его как home
или главная
, а затем перенаправлять с /
на /home
.
- Установите для главной страницы
slug="home"
. Это можно сделать вручную в админпанели или автоматически при создании страницы. - Добавьте перенаправление в
urls.py
.
# app/urls.py
from django.urls import path, redirect
from . import views
urlpatterns = [
path('', lambda request: redirect('page_detail', slug='home'), name='home_page'), # Перенаправление на "home"
path('<slug:slug>/', views.page_detail, name='page_detail'), # Остальные страницы
]
Оба подхода позволяют указать, что главная страница будет отображаться на URL "/"
.
Отправить комментарий
Для отправки комментария вам необходимо авторизоваться.