我正在创建一个简单的 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/