2016-02-29 5 views
4

У меня есть приложение Django, которое является чем-то вроде интернет-магазина. В приложении, POST обрабатывается в templatetag называется posthandler.py как этотDjango, выполнить templatetag перед шаблоном рендеринга

{% load posthandler %} 
{% posthandler %} 

В index.html, который всегда загружен. После этого, в файле есть основной бит как этот

{% block primary %}{% endblock %} 

Теперь, что первичный бит отображает значение, акции, которые могут быть скорректированы в бите posthandler. Значение, значение может быть устаревшим. Это приводит к тому, что человек нажимает на элемент, добавляя его в свой список заказов, но страница, нуждающаяся в двух обновлениях до того, как значение запаса правильно отражает значение в БД.

Я думаю, что это из-за порядка обработки templatetags, что-то вроде этого;

  1. Пользователь кнопку нажмет, чтобы добавить к OrderList
  2. обновления страницы с помощью зрения, первой визуализации значения запаса в index.html на основе того, что в настоящее время в БД
  3. The posthandler.py работает, вычитая один из акций, поэтому БД теперь обновляется.
  4. На странице отображается неправильный номер, поскольку это значение было извлечено из БД до его настройки.

Я бы подумал обработать сообщение в представлении, но я хочу, чтобы один и тот же почтовый манипулятор работал на всех разных страницах, так что это не похоже на путь. Есть лучший способ сделать это? Или, могу ли я заставить основной блок выполнять только после templatetags?

ответ

2

Обработка форм в шаблонах - это действительно ошибка дизайна. Использование middlewares должно соответствовать вашим потребностям.

Другим решением было бы создать View mixin и сделать все ваши представления наследуемыми от этого mixin. Но использование промежуточного ПО должно быть лучше.

Однако почему у вас нет одной страницы, которая обрабатывает этот запрос POST и перенаправляется на точную страницу после обработки формы?

+0

У меня нет такой страницы, потому что я на самом деле не думал об этом. Я посмотрю в средние. – Eloque

+0

Наличие одной страницы, предназначенной для приема и обработки этого запроса POST, похоже на путь. Это будет намного проще, проще и сэкономить накладные расходы на проверку метода запроса, а в случае POST - проверить, что представленная форма является той, которую вы хотите обработать. –

+0

Я вроде бы хочу, чтобы процесс был прозрачным. Возможно, позже даже без перезагрузки.До сих пор предлагаемое промежуточное решение прекрасно работает. Спасибо. – Eloque

0

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

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

Но если модификация должна быть сделана для , все вид, промежуточное ПО, как Antoine suggests, вероятно, путь.

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