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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:45:23