Сейчас загружается

Создания простых страниц с возможностью добавления и редактирования через админпанель в Django 5

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

Чтобы вывести ссылки на все созданные страницы, можно сделать так:

  1. В представлении добавьте запрос для получения всех страниц:
# 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",)}
  1. По умолчанию: Если slug пустой, он будет автоматически сгенерирован из транслитерации title.
  2. Вручную: Если slug задан вручную, он не будет перезаписываться при сохранении.

Теперь, добавляя или редактируя страницу в админпанели, можно:

  • Либо указать slug самостоятельно.
  • Либо оставить его пустым, и он сгенерируется автоматически.

Если нужно оставить поле пустым для главной страницы или оставить возможность указать, что страница — главная.

Для того чтобы задать главную страницу с URL "/", можно использовать специальное условие в методе save или создать отдельную проверку в представлениях и маршрутах. Сейчас мы рассмотрим оба подхода.

Подход 1: Установите поле slug пустым для главной страницы и добавьте обработку в маршрутах и представлениях

  1. Сделайте 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.

  1. Установите для главной страницы slug="home". Это можно сделать вручную в админпанели или автоматически при создании страницы.
  2. Добавьте перенаправление в 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 "/".