如何将Django中新增用户订单的函数视图转换为类视图
Django 函数视图转类视图实现方案
你原有的视图是典型的表单提交处理逻辑,直接继承Django基础View类即可实现转换,完整代码如下:
from django.views import View from django.shortcuts import redirect # 请根据你的实际导入路径调整下面的表单、模型导入 from .forms import UserNewOrderForm from .models import Order, Product from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator # 新增订单属于登录后操作,建议加登录校验装饰器 @method_decorator(login_required, name='dispatch') class AddUserOrderView(View): def post(self, request): new_order_form = UserNewOrderForm(request.POST) if not new_order_form.is_valid(): return redirect('/') # 获取或创建当前用户未支付订单 order = Order.objects.filter(owner_id=request.user.id, is_paid=False).first() if order is None: order = Order.objects.create(owner_id=request.user.id, is_paid=False) # 处理表单数据 product_id = new_order_form.cleaned_data.get('product_id') count = new_order_form.cleaned_data.get('count') if count < 0: count = 1 # 新增订单明细 product = Product.objects.get_by_id(product_id=product_id) order.orderdetail_set.create(product_id=product.id, price=product.price, count=count) # 跳转至商品详情页 return redirect(f'products/{product_id}/{product.title.replace(" ", "-")}') def get(self, request): # GET请求直接跳转首页,和原有逻辑一致 return redirect('/')
路由配置修改
原来的函数视图路由替换为类视图写法即可:
# urls.py from django.urls import path from .views import AddUserOrderView urlpatterns = [ # 原有 path('add-order/', add_user_order, name='add_order'), path('add-order/', AddUserOrderView.as_view(), name='add_order'), # 其他路由保持不变 ]
说明
- 所有业务逻辑完全和你原有的函数视图保持一致,没有做逻辑改动
- 增加了默认的登录校验,避免未登录用户访问时出现
request.user.id报错的问题,如果原有逻辑已经做了全局登录限制可以去掉装饰器 - 不需要渲染表单模板的场景下,使用基础
View类比FormView更简洁,没有多余的冗余逻辑
内容的提问来源于stack exchange,提问作者Ali Pzk
相关产品推荐
相关产品推荐

