【问题标题】:Django, form in menu and form in view conflictingDjango,菜单中的表单和视图中的表单冲突
【发布时间】:2011-08-25 13:04:01
【问题描述】:

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

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

我尝试放置一个不同的操作 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_proj 添加到TEMPLATE_CONTEXT_PROCESSORS,最后在基本模板中使用{{ select_form }} 显示它

【问题讨论】:

  • 您的问题令人困惑。但是,首先是发布导致问题的代码以及您看到的错误消息。
  • 我在我的问题中添加了一些代码,但我没有具体的错误。我只是无法验证我的表单,而无需填写视图中包含的表单。这是一个问题,因为我真的希望菜单是独立的
  • 你的模板怎么样?和你的视图代码?
  • 这对我来说似乎并不令人困惑。基本上,它们有一个通过上下文处理器生成的表单(“菜单表单”)和另一个由页面的视图函数生成的表单(“视图表单”),并且菜单表单阻止了视图表单的验证。
  • 是的,这正是@Mike 所描述的。我真的不能放更多有用的代码..

标签: django forms django-forms validation


【解决方案1】:

由于您有两个表单,您需要有一些东西来告诉您实际提交了哪个表单。这将告诉您的 display_select_proj 函数是否尝试验证表单。

通常,对于一个普通的旧表单,您有一个提交按钮,如果您有两个,每个提交按钮的value 是不同的,因此您可以检查它以判断提交了哪个表单。否则,您需要添加一个隐藏字段来告诉您提交了哪个表单。

一旦您确定提交了哪个表单,您就可以使用它来确定是否需要绑定表单或不绑定表单。例如,在您的代码中,如果您的项目选择器有一个名为“action”且值为“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}

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

【讨论】:

    猜你喜欢
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2011-03-06
    相关资源
    最近更新 更多