Django 表单验证未显示在表单上
我有一个在弹出窗口窗体上运行的自定义窗体验证。如果发生表单验证,我会收到一个错误的请求错误,这是我在myviews.py中编程的错误。如何呈现它,以便用户停留在表单上并显示验证消息。谢谢你的帮助。这是我的密码Django 表单验证未显示在表单上,django,django-views,Django,Django Views,我有一个在弹出窗口窗体上运行的自定义窗体验证。如果发生表单验证,我会收到一个错误的请求错误,这是我在myviews.py中编程的错误。如何呈现它,以便用户停留在表单上并显示验证消息。谢谢你的帮助。这是我的密码 @login_required def K8_Points_Classroom(request): #context_from_k8_points = request.session['k8_points_context'] if request.method == 'P
@login_required
def K8_Points_Classroom(request):
#context_from_k8_points = request.session['k8_points_context']
if request.method == 'POST':
form = K8Points_ClassroomForm(request.POST)
if form.is_valid():
form.save(commit=False)
form.save()
class_name = form.cleaned_data.get('class_name')
getstudents = Student.objects.filter(class_name = class_name)
students = getstudents.all()
form = K8Points_ClassroomForm()
context = {'form': form ,'students' : students, 'class_name': class_name,}
return render(request,'points/k8_points_classroom.html', context)
else:
return HttpResponseBadRequest("Bad Request")
else:
return render(request, 'points/k8_points_classroom.html', {'form': form} )
更新的form.html
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% crispy K8Points_ClassroomForm %}
{% load static %}
{% block content %}
<br>
<h2>{% load static %}
<img src="{% static 'forms/star.png' %}" alt="chain" height="62" width="62"> {{class_name}}</h2>
<br>
<br>
<form action="/points/k8_points_classroom" method="POST">
{% csrf_token %}
<!-- Start Date -->
<div class="container">
<div class="container">
<div class='row'>
<div class="col-4">
<p> Recording Data as User : {{user.username}} </p>
</div>
</div>
<div class='row'>
<div class = "col-2">
{{form.date|as_crispy_field }}
</div>
<div class = "col-2">
{{form.week_of|as_crispy_field }}
</div>
<div class = "col-2">
{{form.day|as_crispy_field }}
</div>
</div>
</div>
</form>
<div class="jumbotron" align="middle">
<img src="{% static 'forms/levelup.png' %}" alt="levelup" height="120" width= "120">
<h1>My Students</h1>
<!-- Line Break -->
<hr style="border: 1px solid black;"/>
<!-- Line Break -->
<div class="row mb-3">
{% for i in students%}
<div class="col-md-4 themed-grid-col"><h2>{{i.student_name}}</h2>
<p align="left"> Today's Score: {{total}}</p>
<h4>
<button type="button" class="btn btn-primary btn-lg btn-block" data-toggle="modal"
data-target="#PointsBox{{ student.pk }}">Level Up
</button>
</h4>
<div id="PointsBox{{ student.pk }}" class="modal fade" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<img src="{% static 'forms/star.png' %}" align="left" alt="chain" height="42"
width="42">
<h4 class="modal-title">Points Confirmation </h4>
<button type="button" class="close" data-dismiss="modal"> ×</button>
</div>
<div class="modal-body">
<h6>
<div class="modal-body">Please add the selected points for the current
student.</div>
</h6>
<form action="/points/k8_points_classroom" method="POST">
{% csrf_token %}
<div class="form-row" align='left'>
<div class="col-7">
{{form.class_name|as_crispy_field }}
<input type="student_name" class="form-control" value ="{{i}}" >
{{form.time_frame|as_crispy_field }}
</div>
</div>
<div class="form-row">
<div class="col-3" align='left'>
{{form.behavior|as_crispy_field }}
{{form.academic|as_crispy_field }}
<button type="submit" class="btn btn-success" ><i
class="fas fa-star"></i> Level Up
</button>
</div>
</div>
</div>
<div class="modal-foot"></div>
</div>
</div>
</div>
</div>
</form>
{% endfor %}
{% endblock %}
{%extends'base.html%}
{%load crispy_forms_tags%}
{%crispy K8Points\u ClassroomForm%}
{%load static%}
{%block content%}
{%load static%}
{{class_name}}
{%csrf_令牌%}
以用户身份记录数据:{{User.username}
{{form.date}as|u crispy_field}
{{form.week|as|u crispy_field}
{{form.day}as|u crispy_field}
我的学生
{i在学生中占%}
{{i.student_name}
今天的分数:{{total}
升级
积分确认
&时代;
请为当前项目添加选定的点
学生。
{%csrf_令牌%}
{{form.class_name}as_crispy_field}
{{form.time|u frame|as_crispy_field}}
{{form.behavior}as_crispy_field}
{{form.academic}as|u crispy_field}
升级
{%endfor%}
{%endblock%}
如果表单无效,则不能返回错误响应。相反,请使用无效表单再次呈现页面,然后在temolate中可以呈现错误。尝试使用{{form.as_p}}
开始呈现表单,您将看到错误。表单错误位于form.errors
中,每个字段都有自己的错误,您可以访问它们form.field.erorrs
if request.method == 'POST':
form = K8Points_ClassroomForm(request.POST)
if form.is_valid():
form.save(commit=False)
form.save()
class_name = form.cleaned_data.get('class_name')
getstudents = Student.objects.filter(class_name = class_name)
students = getstudents.all()
form = K8Points_ClassroomForm()
context = {'form': form ,'students' : students, 'class_name': class_name,}
return render(request,'points/k8_points_classroom.html', context)
return render(request, 'points/k8_points_classroom.html', {'form': form} )
因此,我在整个表单上将crispy表单标记更改为{{form.as_p}},我仍然没有得到弹出表单上显示的错误。它只是将我踢回到没有学生姓名的页面,因为它不会重新启动查询。当你提交表单时,即使你有错误,整个页面也会重新加载。如果您有任何错误,页面将被重新加载,但这一次表单的
errors
属性中将包含信息。如果您将表单的呈现方式更改为{{form.as_p}},并且仍然没有错误,那么请查看这里,这意味着您的表单类可能有错误。您将需要共享您的表单代码,可能您的错误是刚刚发布了表单html。我有一个运行的for循环,第二个{I.student_name}不起作用,只在每个学生姓名上显示查询集的第一人称姓名。您确定其他对象有student_name
?你有另一个错误,但也许你还没有看到它。您正在使用相同的id动态创建modalsid=“PointsBox1”
并且id必须是唯一的,请使用对象的pk
来构造唯一的id,如下所示:id=“PointsBox{{{student.pk}”
我看到您有两个不同的表单,它们具有不同的数据,并且您在上下文中只发送了一个表单(K8Points\u ClassroomForm
)。如果你有不同的表单,你需要为每一个表单创建一个表单类。第二个表单在for循环中,你可以添加一个隐藏字段来知道哪个学生在提交表单。另外,看看这里,可能会很有用