Мне нужна кнопка, включенная в заголовок каждой страницы моего приложения Django, чтобы вызвать какой-либо глобальный метод, чтобы переключить параметр «mode
» в сеансе. Существует два режима: «предварительный просмотр» и «публикация».Django: предоставить глобальный метод для всех (на основе классов) представлений?
Одно из решений, которое я придумал: дублирует метод post()
в каждом (на основе класса) представлении, чтобы обрабатывать изменение режима. Это вряд ли кажется СУХОЙ.
Другим было бы наследовать все мои CBV из одного суперкласса или использовать mixin. Полагаю, это возможность.
Лучшее решение, возможно: Я установил context_processor
, чтобы обработать глобальный доступ к моим шаблонам. Это прекрасно работает. Я также установил класс middleware
с process_request
, который теоретически мог бы обрабатывать запросы POST
по всему миру. Но как я могу назвать этот метод process_request
из моих шаблонов?
Мой текущий удар на него следует. Как переключить кнопки предварительного просмотра и публикации в свой шаблон и вызвать промежуточное ПО?
template.html
:
<html>
<head></head>
<body>
<header>
<form method="post">
{% csrf_token %}
<!-- button toggle -->
{% if mode == 'preview' %}
<button name="mode" value="publish">Publish</button>
{% else %}
<button name="mode" value="preview">Preview</button>
{% endif %}
</form>
</header>
</body>
</html>
middleware.py
:
class MyMiddleware(object):
def process_request(self, request):
update_mode(request)
def update_mode(request, new_mode=None): # how do I call this from template?
modes = [
'preview',
'publish'
]
# ensure default
if not request.session.get('mode', None):
request.session['mode'] = 'preview'
# set new mode
if new_mode and new_mode in modes:
request.session['mode'] = new_mode
context_processor.py
:
def template_mode(request):
context = {
'mode': request.session['mode']
}
return context
Это отличная идея, спасибо, я думаю, что это именно то, что я ищу. Гораздо проще. Всегда ли я получаю запрос от 'post()' в этом новом представлении? Кроме того, нормально ли иметь 'UtilityView' или что-то для обработки разных глобальных запросов, подобных этому? Или люди склонны иметь несколько разовых служебных представлений, по одному для каждой глобальной функции? – allanberry
или, может быть, это хороший повод использовать функциональное представление снова, за один раз – allanberry
. Вы можете использовать только один метод 'post' для каждого класса, поэтому вам потребуется несколько классов классов. Лично я не использую представления на основе классов, у меня просто есть несколько функций отдельных представлений. –