基于Django的理发预约系统:实现已认证用户预约增删改查视图
解决方案:Django理发预约系统的用户预约管理功能
先修正你的预约创建视图,再逐步实现查看、修改、删除功能:
一、修正预约创建视图
现有创建视图存在未关联登录用户、遗漏time字段、错误提示后无页面返回逻辑的问题,修改如下:
方案1:使用Django通用CreateView(推荐)
from django.contrib.auth.mixins import LoginRequiredMixin from django.views.generic import CreateView from django.urls import reverse_lazy from .models import Appointment from django.contrib import messages class AppointmentCreate(LoginRequiredMixin, CreateView): model = Appointment fields = ['service', 'day', 'time'] template_name = 'appointments.html' success_url = reverse_lazy('appointment-list') # 替换为你的预约列表页URL名称 def form_valid(self, form): # 关联当前登录用户 form.instance.user = self.request.user messages.success(self.request, "预约创建成功!") return super().form_valid(form) def form_invalid(self, form): messages.error(self.request, "请填写完整信息!") return super().form_invalid(form)
方案2:保留原生View类的修正版
from django.shortcuts import render, redirect from django.contrib.auth.mixins import LoginRequiredMixin from django.views import View from .models import Appointment from django.contrib import messages class AppointmentCreate(LoginRequiredMixin, View): def get(self, request, *args, **kwargs): return render(request, "appointments.html") def post(self, request, *args, **kwargs): service = request.POST.get('service') day = request.POST.get('day') time = request.POST.get('time') if not service or not day or not time: messages.error(request, "请选择服务、日期和时间") return render(request, "appointments.html") # 关联当前登录用户 appointment = Appointment( user=request.user, service=service, day=day, time=time ) appointment.save() messages.success(request, "预约创建成功!") return redirect('appointment-list') # 跳转到预约列表页
二、实现用户自身预约查看功能
创建视图展示当前登录用户的所有预约:
from django.views.generic import ListView from django.contrib.auth.mixins import LoginRequiredMixin from .models import Appointment class AppointmentList(LoginRequiredMixin, ListView): model = Appointment template_name = 'appointment_list.html' context_object_name = 'appointments' def get_queryset(self): # 仅返回当前用户的预约,按预约时间倒序排列 return Appointment.objects.filter(user=self.request.user).order_by('-time_ordered')
对应的appointment_list.html模板示例:
<h2>我的预约</h2> {% if appointments %} <ul> {% for appointment in appointments %} <li> 服务:{{ appointment.get_service_display }} | 日期:{{ appointment.day }} | 时间:{{ appointment.get_time_display }} <a href="{% url 'appointment-update' appointment.id %}">修改</a> <a href="{% url 'appointment-delete' appointment.id %}">删除</a> </li> {% endfor %} </ul> {% else %} <p>您暂无预约</p> {% endif %} <a href="{% url 'appointment-create' %}">创建新预约</a>
三、实现预约修改功能
用通用UpdateView实现修改,确保用户只能修改自身预约:
from django.views.generic import UpdateView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from .models import Appointment from django.contrib import messages class AppointmentUpdate(LoginRequiredMixin, UpdateView): model = Appointment fields = ['service', 'day', 'time'] template_name = 'appointment_form.html' # 可复用创建视图的模板 success_url = reverse_lazy('appointment-list') def get_queryset(self): # 限制用户只能修改自己的预约 return Appointment.objects.filter(user=self.request.user) def form_valid(self, form): messages.success(self.request, "预约已更新!") return super().form_valid(form)
四、实现预约删除功能
用通用DeleteView实现删除,同样限制仅能删除自身预约:
from django.views.generic import DeleteView from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse_lazy from .models import Appointment from django.contrib import messages class AppointmentDelete(LoginRequiredMixin, DeleteView): model = Appointment template_name = 'appointment_confirm_delete.html' success_url = reverse_lazy('appointment-list') def get_queryset(self): # 限制用户只能删除自己的预约 return Appointment.objects.filter(user=self.request.user) def delete(self, request, *args, **kwargs): messages.success(self.request, "预约已删除!") return super().delete(request, *args, **kwargs)
对应的appointment_confirm_delete.html模板示例:
<h2>确认删除预约?</h2> <p>服务:{{ object.get_service_display }} | 日期:{{ object.day }} | 时间:{{ object.get_time_display }}</p> <form method="post"> {% csrf_token %} <button type="submit">确认删除</button> <a href="{% url 'appointment-list' %}">取消</a> </form>
五、配置URL路由
在urls.py中添加对应路由:
from django.urls import path from .views import AppointmentCreate, AppointmentList, AppointmentUpdate, AppointmentDelete urlpatterns = [ path('appointments/', AppointmentList.as_view(), name='appointment-list'), path('appointments/create/', AppointmentCreate.as_view(), name='appointment-create'), path('appointments/<int:pk>/update/', AppointmentUpdate.as_view(), name='appointment-update'), path('appointments/<int:pk>/delete/', AppointmentDelete.as_view(), name='appointment-delete'), ]
关键注意事项
- 所有视图继承
LoginRequiredMixin,确保仅认证用户可访问 - 通过
get_queryset过滤用户自身预约,防止越权操作 - 模板中必须添加
{% csrf_token %},避免跨站请求伪造
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

