2011-08-25 46 views
0

我想提出一個形式,我的菜單中可以選擇一個項目,保留此信息,並且能夠在站點中的所有時間來改變它。我正在使用context_processor來實現它並(試圖)使用會話變量來保存信息。的Django,形成菜單形式鑑於衝突的

但是我遇到了一個問題。該表單包含在所有其他模板中包含的基本模板中。其他一些模板也包含一個表單,顯然菜單表單和其他表單之間存在某種衝突。例如,當我嘗試驗證視圖表單時,它告訴我菜單表單字段沒有填寫,它不應該關心它。

我試圖把一個不同的動作url沒有效果。

我試圖做甚至可能嗎?如果是這樣,我怎樣才能避免衝突?

用於菜單的形式被稱爲在一個context_processor,該函數的代碼調用它:

def display_select_proj(request): 
     if request.method == "POST": 
       form = SelectForm(request.POST) 
       if form.is_valid(): 
         proj = form.save() 

         request.session['proj'] = proj 

     else: 
       form = SelectForm() 
       proj = "" 

     return {'select_form': form} 

我添加display_select_projTEMPLATE_CONTEXT_PROCESSORS並最終在基片模板i相{{ select_form }}

顯示它
+0

你的問題很混亂。但是,一開始就是發佈導致問題的代碼以及您看到的錯誤消息。 – Marcin

+0

我在我的問題中添加了一些代碼,但沒有具體的錯誤。我無法驗證我的表單而無需填寫視圖中包含的表單。這是一個問題,因爲我真的想要菜單是獨立的 – Johanna

+0

你的模板呢?和你的視圖代碼? – Marcin

回答

1

既然你有兩種形式,你需要有一些東西來告訴你實際提交的表單。這會告訴你的display_select_proj函數是否嘗試驗證表單。

通常情況下,使用一個普通的舊錶單,您有一個Submit按鈕,如果您有兩個,每個提交按鈕的value是不同的,因此您可以檢查它以確定哪個表單已提交。否則,你需要添加一個隱藏字段來告訴你哪個表單被提交。

一旦你能確定哪些形式得到提交,然後你可以用它來計算出,如果你需要綁定一個表單或將其綁定。例如,在你的代碼,如果你的項目選擇了一個提交按鈕命名爲「行動」與價值「變更項目」:

def display_select_proj(request): 
    if request.method == "POST" and (request.POST.get("action", "") 
     == "Change Project"): 
     form = SelectForm(request.POST) 
     if form.is_valid(): 
      proj = form.save() 
      request.session['proj'] = proj 
    else: 
     form = SelectForm() 
     proj = "" 

    return {'select_form': form} 

注意形式將需要額外的檢查,看是否是特殊形式已提交。

+0

太棒了,它似乎工作正常! – Johanna