Django如何实现登录后展示用户自有预订并支持编辑取消
Django实现用户仅可见自有预订记录方案
前置检查:模型层绑定用户关联
首先确认你的预订模型(通常命名为Reservation)已经和Django内置的User模型建立外键关联,这是数据隔离的基础。如果之前没加这个字段,先补到模型里再执行数据库迁移:
from django.db import models from django.contrib.auth.models import User class Reservation(models.Model): # 你已经实现的业务字段,比如预订时间、就餐人数、桌号、联系方式、预订状态等 reserve_time = models.DateTimeField(verbose_name="预订时间") people_count = models.IntegerField(verbose_name="就餐人数") status = models.CharField(max_length=20, default="reserved", verbose_name="预订状态") # 核心关联字段:绑定预订所属用户 user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="reservations", verbose_name="所属用户" )
注意:如果之前已经存在历史预订数据,加外键时需要先给存量数据补全user字段值,否则迁移时会报错。
核心逻辑:视图层做数据过滤
绝对不要在前端模板层做数据过滤,必须在后端查询数据时就完成筛选,避免其他用户的数据泄露。根据你用的视图类型选对应写法即可:
函数视图写法
先加登录校验装饰器拦截未登录用户,查询预订时直接过滤当前登录用户:
from django.contrib.auth.decorators import login_required from django.shortcuts import render from .models import Reservation # 记得在settings.py里配置LOGIN_URL为你的登录页路径,比如LOGIN_URL = "/login/" @login_required def my_reservations(request): # 只查询当前登录用户的预订,可按需求加排序规则 my_reserve_list = Reservation.objects.filter( user=request.user ).order_by("-reserve_time") # 按预订时间倒序,最新的排最前 return render(request, "my_reservations.html", {"reserve_list": my_reserve_list})
类视图(通用视图)写法
如果用Django内置的ListView等通用视图,继承LoginRequiredMixin做登录校验,重写get_queryset方法过滤数据:
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import ListView from .models import Reservation class MyReservationListView(LoginRequiredMixin, ListView): model = Reservation template_name = "my_reservations.html" context_object_name = "reserve_list" def get_queryset(self): return super().get_queryset().filter( user=self.request.user ).order_by("-reserve_time")
权限补全:编辑/取消操作防越权
列表页过滤只是第一步,所有涉及单条预订的操作(编辑、取消、查看详情)都要加权限校验,防止用户通过手动输入URL修改他人的预订。
以编辑、取消功能的函数视图为例:
from django.shortcuts import get_object_or_404, redirect from django.contrib.auth.decorators import login_required from .models import Reservation @login_required def edit_reservation(request, res_id): # 查询时同时校验id和所属用户,不存在直接返回404,用户完全无法访问他人的预订 reserve = get_object_or_404(Reservation, id=res_id, user=request.user) # 原有编辑表单处理逻辑保持不变即可 if request.method == "POST": # 表单校验、保存逻辑 return redirect("my_reservations") return render(request, "edit_reserve.html", {"reserve": reserve}) @login_required def cancel_reservation(request, res_id): reserve = get_object_or_404(Reservation, id=res_id, user=request.user) # 原有取消逻辑,比如修改状态为已取消,或直接删除记录 reserve.status = "cancelled" reserve.save() return redirect("my_reservations")
新手避坑提示
- 不要信任前端传的用户id,所有用户身份校验都从
request.user取,这是Django认证系统校验过的可信数据 - 所有操作单条预订的接口都必须加
user=request.user的查询条件,不要只根据预订id查询 - 加了
@login_required或LoginRequiredMixin后,记得在settings里配置LOGIN_URL参数,否则未登录用户会被跳转到默认的/accounts/login/地址
内容的提问来源于stack exchange,提问作者user17432469
相关产品推荐
相关产品推荐

