我想在我的菜单中放置一个表单,以便能够选择一个项目,保留这些信息并能够在网站中随时更改它。我正在使用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 }}
答案 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}
请注意,每个表单都需要额外检查以查看是否已提交该特定表单。