You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:05:32