конструктор страниц через Админку Django

256
26 мая 2022, 12:40

Дали тестовое задание на джуна, Разработать конструктор из блоков лендинга, которым можно управлять из Django админ панели. В сроки уже не укладываюсь да и уровень не мой нужно учиться дальше, Но очень интересно как такое реализовать куда смотреть в какую сторону копать? Как вообще в Django через админку манипулировать какими-либо элементами на Фронте?

Answer 1

Делаешь несколько моделей.

  1. Непосредственно страница
class LandingPage(models.Model):
    page_title = models.Charfield(verbose_name="Заголовок", max_length=100)
    # ... остальные поля
    class Meta:
        verbose_name = "Страница"
        verbose_name_plural = "Страницы"
    def __str__(self):
        return self.page_title
  1. блоки
class LandingBlock(models.Model):
    BLOCK_TYPE_SIMPLE_TEXT = 'text'
    BLOCK_TYPE_NEWS = 'news'
    BLOCK_TYPE_COMMENT = 'comment'
    BLOCK_TYPE_GALLERY = 'gallery'
    BLOCK_TYPE_FEED_BACK = 'feedback'
    BLOCK_TYPES = (
        (BLOCK_TYPE_SIMPLE_TEXT, "Текстовый блок"),
        (BLOCK_TYPE_NEWS, "Новостной блок"),
        (BLOCK_TYPE_COMMENT, "Комментарий"),
        (BLOCK_TYPE_GALLERY, "Фото галерея"),
        (BLOCK_TYPE_FEED_BACK, "Отзывы"),
    )
    page = models.ForeignKey(LandingPage, verbose_name="Страница", on_delete=models.CASCADE)
    block_type = models.Charfield(verbose_name="Тип блока", choices=BLOCK_TYPES, default=BLOCK_TYPE_TEXT, max_length=100)
    npp = models.PositiveIntegerField(verbose_name = "№", default=0)
    class Meta:
        verbose_name = "Страница"
        verbose_name_plural = "Страницы"
        ordering = ('npp',)
    def __str__(self):
        return "{}. {} {}".format(self.page, self.npp, self.block_type)
        

Если захочешь можно тип блока вместо массива вынести в отдельную модель

затем в файле admin.py регистрируешь модели, добавив inline для блоков.

from django.contrib import admin
from .models import LandingBlock, LandingPage
class BlockInlineAdmin(admin.TabularInline):
    model = LandingBlock
    
    
class PageAdmin(admin.ModelAdmin):
    inlines = [BlockInlineAdmin]
    
admin.site.register(LandingPage, PageAdmin)

Так же для того, что бы можно было легко перетаскивать блоки внутри страницы для сортировки, я бы поставил django-admin-sortable2 тогда admin.py будет выглядеть так(не забудь только добавить в settings.py это приложение, подробней об установке - https://django-admin-sortable2.readthedocs.io/en/latest/installation.html)

from django.contrib import admin
from adminsortable2.admin import SortableInlineAdminMixin
from .models import LandingBlock, LandingPage
class BlockInlineAdmin(SortableInlineAdminMixin, admin.TabularInline):
    model = LandingBlock
    
    
class PageAdmin(admin.ModelAdmin):
    inlines = [BlockInlineAdmin]
    
admin.site.register(LandingPage, PageAdmin)

Ну и затем уже во view когда будешь готовить html для каждой страницы тебе нужно будет последовательный вывод блоков, которые привязаны к этой странице

READ ALSO
Регулярное выражение: поиск подстроки содержащее заданное слово с исключением при другом слове

Регулярное выражение: поиск подстроки содержащее заданное слово с исключением при другом слове

Нужно распарсить html-документ и найти все начальные теги <div>, которые содержат определенное слово, но при этом исключить строки содержащие...

216
Не проходит последние тесты, задача C++

Не проходит последние тесты, задача C++

В классических ролевых играх есть 3 стандартных класса: Воин (Warrior), Маг (Mage), Вор (Rogue)Для каждого из классов важен определённый атрибут: для...

260
Не работает программа ищущая расстояние между двумя точками [закрыт]

Не работает программа ищущая расстояние между двумя точками [закрыт]

Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткойХотя похожие вопросы могут быть уместны на этом сайте, решение...

212
Распаковка variadic templates

Распаковка variadic templates

У меня есть шаблонная функция, которая принимает на вход параметры Args

240