登录后用户预订内容无法显示问题排查求助
登录后无法显示个人预订内容的问题排查及修复
核心问题分析
1. 模板与视图的变量名不匹配
视图中传给模板的变量是my_bookings,但模板循环遍历的是bookings,变量名不一致直接导致模板无法获取到数据,这是内容不显示的关键原因。
2. 视图中错误使用filter函数
你写的my_bookings = filter(self, booking)是完全错误的用法:filter()是Python内置的序列过滤函数,而Booking.objects.filter(user=request.user)已经直接返回了当前用户的所有预订QuerySet,不需要额外处理。
3. ListView用法不规范
既然继承了generic.ListView,更合理的方式是重写get_queryset方法来过滤用户数据,而非直接重写get方法,这样能复用ListView自带的逻辑,代码更简洁规范。
4. HTML模板结构错误
{%endfor%}闭合标签放在了.card-text内部,且多个外层div(如<div class="row">、<div class="col-md-3 mt-5 offset-md-3">)未正确闭合,会导致页面结构混乱,即使数据正确也无法正常渲染。
修正后的代码示例
视图代码(views.py)
class ListBookingView(generic.ListView): """ 显示当前登录用户的所有预订,支持编辑或删除 """ model = Booking template_name = 'my_bookings.html' context_object_name = 'bookings' # 指定模板中使用的变量名,与模板循环名保持一致 def get_queryset(self): # 仅返回当前登录用户的预订数据 if self.request.user.is_authenticated: return Booking.objects.filter(user=self.request.user) return Booking.objects.none() # 未登录时返回空集合 def dispatch(self, request, *args, **kwargs): # 未登录用户直接重定向到登录页 if not request.user.is_authenticated: return redirect('account_login') return super().dispatch(request, *args, **kwargs)
模板代码(my_bookings.html)
{% extends "base.html" %} {% block content %} <section id="booking" class="book_a_table"> <div class="booking_container"> <h2>My Bookings:</h2> <p>To edit or cancel a booking please click on the buttons below.</p> <div class="row"> {% for booking in bookings %} <div class="col-md-4 mt-5"> <div class="card mb-4"> <div class="card-body"> <h4 class='card-title text-uppercase text-center'>{{ booking.date }} at {{ booking.time }}</h4> <h6 class="text-uppercase">{{ booking.name }}</h6> <div class='card-text'> <p><i class="fas fa-phone"></i> {{ booking.phone }}</p> <p><i class="far fa-envelope"></i> {{ booking.email }}</p> <p>Number of People: {{ booking.number_of_people }}</p> </div> <!-- 可在此添加编辑/删除按钮 --> <!-- <a href="{% url 'edit_booking' booking.id %}" class="btn btn-primary">Edit</a> --> <!-- <a href="{% url 'delete_booking' booking.id %}" class="btn btn-danger">Delete</a> --> </div> </div> </div> {% empty %} <!-- 无预订时显示提示 --> <div class="col-12 text-center mt-5"> <p>You have no bookings yet.</p> </div> {% endfor %} </div> </div> </section> {% endblock %}
内容的提问来源于stack exchange,提问作者user17432469
相关产品推荐
相关产品推荐

