python - 如何在另一个视图中的 HttpRedirect 之后在 Django 模板中显示错误消息?
问题描述
我正在创建一个简单的 CRUD 应用程序,而不使用 Django 的管理页面。我只有一个模板 index.html,它显示所有学生信息列表。我下面有两个视图,一个是仅在用户访问索引页面时显示。当索引页面中的用户单击提交按钮以注册新学生(通过 POST)然后再次重定向到索引视图时,将执行另一个视图。如果学生已经存在于数据库中(通过使用学号),我想显示一条错误消息。我的问题是如何在 HttpRedirect 之后在 index.html 模板中传递错误消息。还是我做错了?
def index(request):
studentList = Student.objects.all()
return render(request, "crud/index.html", {"student_list": studentList})
def addStudent(request):
data = request.POST
# print(data)
if data:
try:
newStudent = Student.objects.get(student_number=data['student_number'])
return HttpResponseRedirect(reverse("crud:index"))
except Student.DoesNotExist:
newStudent = Student(student_number=data['student_number'],
first_name=data['first_name'],
last_name=data['last_name'],
age=data['age'],
sex=data['sex'],
email=data['email']
)
newStudent.save()
return HttpResponseRedirect(reverse("crud:index"))
解决方案
您应该.get_or_create
为此使用:
from django.core.exceptions import SuspiciousOperation
def addStudent(request):
data = request.POST
student, created = Student.objects.get_or_create(
student_number=data['student_number'],
first_name=data['first_name'],
last_name=data['last_name'],
age=data['age'],
sex=data['sex'],
email=data['email']
)
if created:
return HttpResponseRedirect(reverse("crud:index"))
else:
raise SuspiciousOperation("student with id {} already exists!".format(data['student_number']))
更新
如果你想继续重定向,并且仍然向用户发送警报,你应该使用 Django 的内置消息中间件。
这是一个例子:
from django.contrib import messages
def addStudent(request):
...
if not created:
messages.warning(request, 'Student with ID {} already exists!'.format(data['student_number']))
return HttpResponseRedirect(reverse("crud:index"))
现在在您的 上index.html
,您需要检查是否存在任何消息,如果存在,则显示它们:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
如果您想自定义消息的外观和行为,请参阅文档了解更多详细信息。
推荐阅读
- python - 熊猫填充(方法='填充')与填充()
- android - 该应用程序在模拟器中运行良好,但在手机中运行不正常
- spring - Spring MVC @GetMapping("") 在第一个请求中执行了 3 次
- import - 我无法在 pycharm 中正确导入 unicode 模块
- html - 为什么在溢出内输入绝对位置会导致页面上的全局滚动条?
- arrays - `int (*arr1)[10]` 与 `int arr2[10]` 有何不同?
- node.js - 如何从所有使用电子邮件的用户中排除当前用户?
- android - 使用工具时出现错误:openDrawer。\为什么?
- javascript - 如果不可用,请加载其他链接
- reactjs - 即使 url 更改,路由组件也不会呈现。使用自定义 webpack