Отражение элементов HTML - Django - PullRequest
0 голосов
/ 18 декабря 2018

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

Каждое из написанных выше действий должно быть доступно из меню администратора (в данном случае это стандартная среда администрирования django).

У меня возникла идея использовать совершенно новую модель:

class MainSiteButton(models.Model):
    button_title = models.CharField(
        max_length=100, 
        null=True, 
        blank=False, 
        default="Click to edit",
        verbose_name="Text of the button"
    )

    button_style = models.CharField(
        max_length=10000, 
        null=True, 
        blank=False, 
        default="font-size: 10px; font-color: green;",
        verbose_name="Style of the button"
    )

    button_default_name = models.CharField(
        choices=button_default_name_choices,
        max_length=500, 
        null=True, 
        blank=False, 
        default=next(iter(button_default_name_choices))[0],
        verbose_name="Button back-end identifier"
    )

Используя данную модель, я собираюсь определить каждую кнопку, которая определена в меню веб-страницы.

Они будут иметь такую ​​форму:

queried_home_button = MainSiteButton.objects.create(
    button_title="Home",
    button_default_name='home_button'
)
queried_logout_button = MainSiteButton.objects.create(
    button_title="Logout",
    button_default_name='logout_button'
)
queried_login_button = MainSiteButton.objects.create(
    button_title="Login",
    button_default_name='login_button'
)

Операция определения новых кнопок будет выполняться только один раз при запуске сервера

Еще один шаг - определитьЛенивый контекстный процессор:

@memoize
def texts_of_buttons(request):
    context_data = dict()

    try:

        queried_home_button = MainSiteButton.objects.filter(
            button_default_name='home_button'
        )[0]
        queried_logout_button = MainSiteButton.objects.filter(
            button_default_name='logout_button'
        )[0]
        queried_login_button = MainSiteButton.objects.filter(
            button_default_name='login_button'
        )[0]

        context_data['home_button'] = queried_home_button
        context_data['logout_button'] = queried_logout_button
        context_data['login_button'] = queried_login_button

    except Exception as e:
        logger.error(
            'Problem: exception occured in MainSubPageController'
            + '\nError: ' + str(texts_of_buttons)
        )

    return context_data

Чтобы наконец использовать его в базовом шаблоне:

<a class="item {{ home_button.button_style|safe }}" href="{% url 'home' %}">{{ home_button.button_title }}</a>
<a class="item {{ queried_login_button.button_style|safe }}" href="{% url 'login' %}">{{ queried_login_button.button_title }}</a>
<a class="item {{ queried_logout_button.button_style|safe }}" href="{% url 'logout' %}">{{ queried_logout_button.button_title }}</a>

Возникает вопрос, существует ли лучшее решение (что означает более быстрое, требующее меньше ресурсов памяти *)1021 *

...