Я пытаюсь дать администратору веб-службы возможность называть кнопки главного меню, используя любой текст, который он или она хочет.Более того, я хочу разрешить ему играть со стилями, которыми будет описана конкретная кнопка.
Каждое из написанных выше действий должно быть доступно из меню администратора (в данном случае это стандартная среда администрирования 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 *