我一直在做django教程,我现在正在努力使其适应我的需求。 在第04部分,turorial教我们如何写表格。
我已经重复使用本教程的这一部分来尝试编写一个单选按钮选择表单。
大多数工作正在显示,可选择不同的输入,并且验证会将我发送到相关页面。
如果在没有答案的情况下验证表单,则代码应显示 error_message 。 我的问题是,我第一次打开页面时已经显示此消息。
我到处寻找原因,但我似乎是唯一一个遇到这个问题的人。
以下是 index.html 文件
<!DOCTYPE html>
<html>
<head>
<title>Syl - Projects</title>
</head>
<h1>Project List</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="" method="post">
{% csrf_token %}
{% for choice in project_list %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.name }}</label><br />
{% endfor %}
<input type="submit" value="Accéder au projet" />
</form>
</html>
这是 views.py 文件
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.template import RequestContext, loader
from django.core.urlresolvers import reverse
from gantt.models import Project
from gantt.models import *
def index(request):
project_list = Project.objects.order_by('name')
try:
selected_project = project_list.get(pk=request.POST['choice'])
except (KeyError, Project.DoesNotExist):
return render(request, 'gantt/index.html', {
'project_list': project_list,
'error_message': "Vous n'avez pas fait de choix.",
})
else:
return HttpResponseRedirect(reverse('syl:project', args=(selected_project.slug,)))
... ...
感谢您的回答。
我必须添加IF条件以防止在第一页加载时调用request.post。 然而,添加它意味着我必须为初始页面加载添加另一个渲染,因为它不可能为此目的使用重定向(它的参数还不存在)。
再次Thansk。
新版 views.py 文件:
def index(request):
project_list = Project.objects.order_by('name')
if request.method=="POST":
try:
selected_project = project_list.get(pk=request.POST['choice'])
except (KeyError, Project.DoesNotExist):
return render(request, 'gantt/index.html', {
'project_list': project_list,
'error_message': "Vous n'avez pas fait de choix.",
})
else:
return HttpResponseRedirect(reverse('syl:project', args=(selected_project.slug,)))
else:
return render(request, 'gantt/index.html', {'project_list': project_list})
答案 0 :(得分:1)
尝试添加&#34; if request.method ==&#39; POST&#39;&#34;在尝试在视图中获取所选项目之前。当第一次查看页面的人加载了此视图的GET请求时,您的代码已经在寻找要使用的POSTed变量。它还没有,所以你得到负载错误。
将此部分包含在这样的if块中将告诉您的代码&#34;如果还没有提交,只需显示该表单。如果有提交,请进行处理。&#34;现在它试图立即跳过处理,看到没有选择,并抛出错误。