Графический интерфейс CSS в Django - PullRequest
0 голосов
/ 08 июня 2018

Я хочу добавить функциональность, которая позволит пользователю выбрать «тему интерфейса»:

Я добавил выпадающий список в моем файле base.html, чтобы пользователь мог изменить тему во всех шаблонах.

Я использую base.html для всех моих html-шаблонов, используя {% extends 'base.html'%}.

'# Все мои представления будут нуждаться в следующем:

theme = MyThemeModel.objects.filter(user=self.request.user).first().theme

return render(request, 'mytemplate.html', {'theme': theme})

'# base.html

{% if theme = 'theme 1'%}
<link rel="stylesheet" type="text/css" href="{% static 'theme1.css' %}" />
{% else if theme = 'theme 2'%}
<link rel="stylesheet" type="text/css" href="{% static 'theme2.css' %}" />
{% else if theme = 'theme 3'%}
<link rel="stylesheet" type="text/css" href="{% static 'theme3.css' %}" />
{% endif%}

Я думаю об использовании AJAX, чтобы я мог выбрать тему, которую выбрал пользователь, но тогда мне нужно будет добавить функцию в каждое существующее представление, и я не будуНе хочу повторять большую часть кода.

Есть ли более простой способ сделать это?

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете использовать промежуточное ПО Django для добавления вашей переменной theme в каждый запрос.Имейте в виду, что способ, которым вы в настоящее время извлекаете тему пользователя, будет добавлять дополнительный запрос к базе данных к каждому запросу.

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

if not request.session.theme:
    request.session.theme = MyThemeModel.objects.filter(user=self.request.user).first().theme

После этого вы сможете получить доступ к request.session.theme во всех ваших представлениях и шаблонах.

Еще один вопрос, который у меня возникнет: почему вы сохраняете, какой пользовательиспользовать какую тему на MyThemeModel вместо вашей User модели?Если вы сохранили его в своей пользовательской модели, вы могли бы просто использовать request.user.theme, и вам не понадобилось бы промежуточное программное обеспечение вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...