Создания простых страниц с возможностью добавления и редактирования через админпанель в 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 "/".
Отправить комментарий
Для отправки комментария вам необходимо авторизоваться.