python - 如何从另一个 View 进行 HttpRedirect 后在 Django 模板中显示错误消息?

标签 python django

我正在创建一个简单的 CRUD 应用程序,而不使用 Django 的管理页面。我只有一个模板,index.html,它显示所有学生信息列表。我下面有两个 View ,一个是仅在用户访问索引页面时显示。当索引页面中的用户单击用于注册新学生的提交按钮(通过 POST)然后再次重定向到索引 View 时,会执行另一个 View 。如果数据库中已存在该学生(通过使用学号),我想显示一条错误消息。我的问题是如何在 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 %}

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

关于python - 如何从另一个 View 进行 HttpRedirect 后在 Django 模板中显示错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58228681/

相关文章:

python - 执行 python 和 sql 代码将变量发送到数据库后出现此错误

python - 具有 1 个和 2 个可迭代元素的列表的字典理解

python - 在 Django 中找不到 View

python - 当另一个数据库插入一条记录时如何更新一个数据库?

python - 对于网站抓取库来说,Perl 或 Python 的良好起点是什么?

python - 将 DataFrame 对象转换为字符串或对齐 DataFrame 编码

python - Django:覆盖 get_FOO_display()

python - django 应用程序中模型的自连接是否是可接受的模式?

python - Django AllAuth - 如何手动发送重置密码电子邮件?

python - `yield from asyncio.sleep(delay)` 是做什么的?