2012-01-24 50 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. 發送您的按鈕不同的URLconf一些變量(如三個字母ARG)。所有這些概念都指出了以這三個字母爲參數的相同觀點,然後它知道該怎麼做。儘管如此,這仍然可能導致級聯。

  2. 或者,將它們一起發送到不同的視圖。

  3. 你可以嘗試做某事ajaxy。這些數據仍然在後字典中,但是您將更好地控制後字典的結構。

我也假設GET不是任何這些選項(但如果其他結構仍然導致)。

+0

我該怎麼做1或2?我認爲表單URL實際上是由它的action屬性定義的。 –

+0

看完所有東西后,它看起來像上面所有的暗示一些JavaScript。現在我試圖避免這種情況,但我會記住更高級的實現。 –

+0

@equinoxel你可以使用action元素髮送到特定的url。從您的示例中獲取

相關問題