2012-01-24 6 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 사전 외부에서 클릭 한 버튼을 얻을 수있는 방법이 있습니까?

추신 : "여러 단추"질문에 대한 다른 답장을 보았지만 모두 제공 요청입니다. 답변은 답변입니다.

답변

2

행동과 문자열의 모든보기에 이미있는 경우, 그 행동들에 대해서 그냥 반복하지 않으시겠습니까?

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

버튼 이름을 일반 양식 필드 이름으로 사용하지 않는 것이 좋습니다.


몇 가지 대안 : 제출을 처리하고 같은 "행동"과 같은 하나의 양식 필드를 설정하는 자바 스크립트 사용.

regex 패턴 또는 문자열 비교로 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. 가 (세 편지 인수와 같은) 어떤 변수로 다른 URLconf는에 버튼을 보냅니다. 이 모든 confs는이 세 글자 arg를 인수로 취한 동일한 견해를 가리키며, 그 인수는 무엇을해야 할지를 알고 있습니다. 그래도 캐스케이드가 발생할 수 있습니다.

  2. 다른보기로 모두 보내십시오.

  3. ajaxy를 시도해 볼 수 있습니다. 데이터는 여전히 post dict에 있지만, post dict이 구조화되는 방식을보다 잘 제어 할 수 있습니다. 나는 또한 GET 있으리라 믿고있어

는 이들의에 대한 옵션이 없습니다 (아직 여전히 다른 구조물 경우에 발생합니다.)

+0

어떻게 1 또는 2를 할 수 있습니까?나는 양식 URL이 실제로 action 속성에 의해 정의 된 것이라고 생각했다. ..? –

+0

사물을 보았을 때 위의 모든 것이 자바 스크립트를 암시하는 것처럼 보입니다. 이제는이를 피하려고 노력하고 있지만 더 고급 구현을 위해이를 염두에 두겠습니다. –

+0

@equinoxel action 요소를 사용하여 특정 URL로 보낼 수 있습니다. 당신의 예제에서 취하는

관련 문제