Django CRUD应用:如何按请求方法配置路由并移除/store路径
嘿,这个需求完全贴合RESTful的设计思路,Django的路由系统轻松就能实现——不用单独搞/store路径,直接靠请求方法(GET/POST/DELETE)来区分同一URL下的不同操作就行!我给你两种常用的实现方案,你可以根据自己的开发习惯选:
实现方案:基于请求方法的路由区分
一、类视图实现(推荐,更优雅)
Django的类视图天生就支持按HTTP请求方法分发处理逻辑,比如get()、post()、delete()方法会自动对应同名的请求类型,非常适合这种场景。
1. urls.py 配置
把所有预约相关操作都映射到同一个基础URL,单个预约的操作再通过主键区分:
from django.urls import path from . import views urlpatterns = [ # 集合级操作:GET拿列表(原index)、POST创建预约(原store) path('appointments/', views.AppointmentListView.as_view(), name='appointment-list'), # 单个预约操作:GET看详情(原view)、DELETE删记录(原delete) path('appointments/<int:pk>/', views.AppointmentDetailView.as_view(), name='appointment-detail'), ]
2. views.py 实现
创建两个类视图,分别处理集合和单个资源的操作:
from django.views import View from django.shortcuts import render, get_object_or_404, redirect from django.http import JsonResponse from .models import Appointment from .forms import AppointmentForm # 假设你已经定义了预约表单 # 处理预约列表和创建逻辑 class AppointmentListView(View): def get(self, request): # 对应原index功能:返回所有预约记录的列表页 appointments = Appointment.objects.all() return render(request, 'appointments/index.html', {'appointments': appointments}) def post(self, request): # 对应原store功能:提交表单创建新预约 form = AppointmentForm(request.POST) if form.is_valid(): form.save() return redirect('appointment-list') # 保存成功后跳回列表页 # 表单验证失败,返回创建页并显示错误 return render(request, 'appointments/create.html', {'form': form}) # 处理单个预约的详情查看和删除逻辑 class AppointmentDetailView(View): def get(self, request, pk): # 对应原view功能:返回单个预约的详情页 appointment = get_object_or_404(Appointment, pk=pk) return render(request, 'appointments/view.html', {'appointment': appointment}) def delete(self, request, pk): # 对应原delete功能:删除指定预约 appointment = get_object_or_404(Appointment, pk=pk) appointment.delete() # 前端如果是AJAX请求,返回JSON响应;如果是表单提交,重定向回列表 if request.headers.get('X-Requested-With') == 'XMLHttpRequest': return JsonResponse({'status': 'success'}) return redirect('appointment-list')
小提示:浏览器默认不支持直接发送DELETE请求,如果是用普通表单提交,你可以在表单里加个隐藏字段
<input type="hidden" name="_method" value="DELETE">,然后在视图里兼容这种模拟请求(比如判断request.POST.get('_method') == 'DELETE')。
二、函数视图实现(适合简单场景)
如果你更习惯用函数式写法,可以用require_http_methods装饰器限制每个函数允许的请求方法,把同一URL的不同方法映射到对应逻辑:
1. urls.py 配置
from django.urls import path from . import views urlpatterns = [ path('appointments/', views.appointment_list, name='appointment-list'), path('appointments/<int:pk>/', views.appointment_detail, name='appointment-detail'), ]
2. views.py 实现
from django.shortcuts import render, get_object_or_404, redirect from django.http import JsonResponse from django.views.decorators.http import require_http_methods from .models import Appointment from .forms import AppointmentForm @require_http_methods(["GET", "POST"]) def appointment_list(request): if request.method == 'GET': # 原index功能:返回预约列表 appointments = Appointment.objects.all() return render(request, 'appointments/index.html', {'appointments': appointments}) elif request.method == 'POST': # 原store功能:创建新预约 form = AppointmentForm(request.POST) if form.is_valid(): form.save() return redirect('appointment-list') return render(request, 'appointments/create.html', {'form': form}) @require_http_methods(["GET", "DELETE"]) def appointment_detail(request, pk): appointment = get_object_or_404(Appointment, pk=pk) if request.method == 'GET': # 原view功能:返回单个预约详情 return render(request, 'appointments/view.html', {'appointment': appointment}) elif request.method == 'DELETE': # 原delete功能:删除预约 appointment.delete() return JsonResponse({'status': 'success'})
核心逻辑说明
配置完成后,同一个URL会自动根据请求方法分发逻辑:
GET /appointments/→ 执行原index(列表)功能POST /appointments/→ 执行原store(创建)功能GET /appointments/<pk>/→ 执行原view(详情)功能DELETE /appointments/<pk>/→ 执行原delete(删除)功能
完全不需要单独的/store路径,既简洁又符合HTTP语义规范。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

