2011-08-25 48 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