Django,菜单中的表单和视图中的冲突形式

时间:2011-08-25 13:04:01

标签: django forms django-forms validation

我想在我的菜单中放置一个表单,以便能够选择一个项目,保留这些信息并能够在网站中随时更改它。我正在使用context_processor来实现它并(尝试)使用会话变量来保存信息。

然而我碰到了一个问题。表单包含在基本模板中,该模板包含在所有其他模板中。其他一些模板也包含一个表单,显然菜单表单和其他表单之间存在一种冲突。例如,当我尝试验证视图表单时,它告诉我菜单表单字段没有填写,它不应该关心它。

我尝试使用不同的动作网址。

我正在尝试做甚么可能吗?如果是这样,我该如何避免冲突?

菜单的表单在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_proj添加到TEMPLATE_CONTEXT_PROCESSORS,最后在基本模板中,我将其显示为{{ select_form }}

1 个答案:

答案 0 :(得分:1)

由于您有两个表单,因此需要告诉您实际提交的表单。这将告诉您的display_select_proj函数是否尝试验证表单。

通常,使用普通旧表单,您有一个“提交”按钮,如果您有两个,则每个提交按钮的value不同,因此您可以检查它以告知提交的表单。如果做不到这一点,您需要添加一个隐藏字段来告诉您哪个表单已提交。

一旦您确定提交了哪个表单,您就可以使用它来确定是否需要绑定表单或将其保留为未绑定。例如,在您的代码中,如果您的项目选择器有一个名为“action”的Submit按钮,其值为“Change Project”:

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}

请注意,每个表单都需要额外检查以查看是否已提交该特定表单。