2012-01-24 4 views
0

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

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

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

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

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


Несколько альтернатив: использования Javascript для обработки представления и он установлен единое поля формы, таких как «действие».

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

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

if action: 
    ACTIONS[action]() 
+0

То, что я пытаюсь избежать, это двойное вложение ... Я надеялся, что есть другой способ. –

+0

Похоже, что у меня будет использовать что-то эквивалентное последнему фрагменту кода на данный момент :) Спасибо за идею префикса! –

1

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

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

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

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

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

+0

Как я могу сделать 1 или 2?Я думал, что URL-адрес формы фактически определяется его атрибутом действия ..? –

+0

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

+0

@equinoxel вы можете отправить на определенный URL-адрес с помощью элемента действия. Взяв из вашего примера

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