视图内条件执行问题:用户专属变量声明报错及优化咨询
问题2:视图内条件声明的更优实现方式
你的当前实现是可行的,但可以从代码可读性、可维护性、复用性三个维度优化,推荐几种方案:
方案1:使用基于类的视图(CBV)拆分逻辑
Django的CBV天然适合这种按用户类型区分的场景,把模板选择、上下文注入拆分成独立方法,代码更清晰:
from django.views.generic import DetailView class OrderDetailView(DetailView): model = Order context_object_name = 'order' # 模板中用{{ order }}引用订单对象 def get_template_names(self): # 根据用户类型返回对应模板 if self.request.user.is_supervisor: return ['orders/order_mgt/detail.html'] return ['orders/order_detail.html'] def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 仅给Supervisor注入配送员列表 if self.request.user.is_supervisor: user_location = self.request.user.supervisor.town deliverers = User.objects.filter(deliverer__town=user_location) context['all_delivery_guys_in_town'] = deliverers return context
方案2:拆分视图+权限装饰器
如果Supervisor的订单管理逻辑后续会变得复杂,建议把它拆成独立视图,用user_passes_test装饰器做权限校验,主视图只负责分发:
from django.contrib.auth.decorators import user_passes_test # 定义权限校验函数 def is_supervisor(user): return user.is_supervisor # Supervisor专属视图 @user_passes_test(is_supervisor) def supervisor_order_detail(request, order_id): order = get_object_or_404(Order, id=order_id) user_location = request.user.supervisor.town deliverers = User.objects.filter(deliverer__town=user_location) context = {'order': order, 'all_delivery_guys_in_town': deliverers} return render(request, 'orders/order_mgt/detail.html', context) # 普通用户视图 def regular_order_detail(request, order_id): order = get_object_or_404(Order, id=order_id) return render(request, 'orders/order_detail.html', {'order': order}) # 分发主视图 def order_detail(request, order_id): if request.user.is_supervisor: return supervisor_order_detail(request, order_id) return regular_order_detail(request, order_id)
额外小优化:避免关联对象不存在的报错
如果存在「用户是Supervisor但未绑定town」的情况,建议加一层判断避免抛出属性错误:
if request.user.is_supervisor and hasattr(request.user, 'supervisor') and request.user.supervisor.town: # 执行配送员查询逻辑
内容的提问来源于stack exchange,提问作者Magere
相关产品推荐
相关产品推荐

