首页 > 解决方案 > 如何在另一个视图中的 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"))

标签: pythondjango

解决方案


您应该.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 %}

如果您想自定义消息的外观和行为,请参阅文档了解更多详细信息。


推荐阅读