Получить кнопку отправки нажал в форме Django в общем виде - PullRequest
0 голосов
/ 24 января 2012

У меня есть конечный автомат (django-fsm), который позволяет объекту переходить из исходного состояния в одно из нескольких целевых состояний.Я могу добавить все действия в словаре, например:

ACTIONS { 'button_1': action1,
          'button_2': action2,
           ...
}

Это переводит в форму с кнопкой отправки для каждого состояния.

  {% for n,m in object.get_available_current_state_transitions %}
      <input type="submit" class="btn" value="{{ n|get_action|capfirst }}"
             name="button_{{n}}" />
  {%endfor%}

  <input type="submit" class="btn primary" value="Save">
  <a class="btn" onclick="javascript:history.go(-1)">Cancel</a>

Это обычно приводит к более чем 3 кнопкам.

Нажатие кнопки приводит к определенному действию, определенному в моем случае в классе модели.

Теперь я знаю, что могу получить нажатую кнопку в словаре request.POST, но этоприведет к каскаду, если:

  if 'button_1' in request.POST:
      action_1()
  elif 'button_2' in request.POST:
      ...

Есть ли какой-нибудь способ, чтобы кнопка была нажата отдельно (в идеале от объекта запроса) в переменной, чтобы у меня было что-то вроде

ACTIONS[clicked_button_name](...)

?Другими словами, есть ли какой-нибудь способ получить нажатую кнопку за пределами словаря POST?

PS: я посмотрел другие ответы на вопрос о «нескольких кнопках», но все предлагают request.POST как ответ.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Если все действия и строки уже находятся в вашем представлении, почему бы вам просто не повторить эти действия dict?

for key, value in ACTIONS.items():
    if key in request.POST:
        value()

Просто очень маловероятно, что названия ваших кнопок будут использоваться как обычныеимя поля формы.


Несколько альтернатив: использовать javascript для обработки отправки и задать ему одно поле формы, например "action".

Использоватьбольше уникальных ключей и фильтрацию через request.POST.keys () с шаблоном регулярного выражения или сравнением строк.

action = [x for x in request.POST.keys() if 'FAIRLY_UNIQUE_BUTTON_PREFIX' in x]

if action:
    ACTIONS[action]()
1 голос
/ 24 января 2012

Я не думаю, что напрямую, но пара обходных путей может быть:

  1. Отправляйте свои кнопки различным URL-адресам с некоторой переменной (например, трехбуквенным аргументом). Все эти конфы указывают на одну и ту же точку зрения, принимая в качестве аргумента этот трехбуквенный аргумент, который затем знает, что делать. Тем не менее, это может привести к каскаду, если еще.

  2. Или отправьте их в разные представления вместе.

  3. Вы можете попробовать сделать что-нибудь ajaxy. Данные по-прежнему будут находиться в состоянии после диктата, но вы будете иметь больше контроля над его структурой.

Я также предполагаю, что GET не подходит ни для одного из них (но это все равно приводит к структурам if else.)

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