2015-06-10 4 views
0

Мне нужна кнопка, включенная в заголовок каждой страницы моего приложения 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 

ответ

2

Вы не называете промежуточное ПО: это совсем не так, как это работает. Среднее программное обеспечение вызывается по каждому запросу, поэтому в вашем случае функция update_mode всегда будет работать.

Лучшим решением было бы получить форму, содержащую кнопку для публикации, на новый URL-адрес, который вызывает представление для обновления режима. Вы можете добавить скрытое поле, содержащее текущий URL-адрес, который вы можете получить от request.path, и режим режима обновления может перенаправлять обратно на этот URL после выполнения своей работы.

+0

Это отличная идея, спасибо, я думаю, что это именно то, что я ищу. Гораздо проще. Всегда ли я получаю запрос от 'post()' в этом новом представлении? Кроме того, нормально ли иметь 'UtilityView' или что-то для обработки разных глобальных запросов, подобных этому? Или люди склонны иметь несколько разовых служебных представлений, по одному для каждой глобальной функции? – allanberry

+0

или, может быть, это хороший повод использовать функциональное представление снова, за один раз – allanberry

+1

. Вы можете использовать только один метод 'post' для каждого класса, поэтому вам потребуется несколько классов классов. Лично я не использую представления на основе классов, у меня просто есть несколько функций отдельных представлений. –

1

Я бы так не сделал - как насчет создания тега шаблона для формы?

В вашем templatetags.py:

def set_session_mode_form(): 
    return {'session_form': SessionForm()} 

register.inclusion)tag("<path-to-your-template>",set_session_mode_form) 

Тогда ваша форма сессии направляет представление, которое обновляет переменную сеанса вы хотите. Чтобы использовать его, просто загрузите теги на свою страницу и используйте {% include%}. Таким образом, его очень легко добавить на любую страницу и сохранить ее СУХОЙ.

+0

Это полезно, спасибо.Я считаю, что он в принципе рекомендует то, что @Daniel Roseman говорит в другом ответе, хотя ... отправить на заказ, который обрабатывает переменную. Мне нравится идея пользовательского тега шаблона, но в этом случае это может быть соус. – allanberry

 Смежные вопросы

  • Нет связанных вопросов^_^