如何在Django DetailView类视图中传递time_delta(td)上下文?
在Django DetailView中添加时间差上下文变量
你已经在函数视图(FBV)中实现了计算time_delta并传入模板上下文的逻辑,现在要在类视图(DetailView)中复用相同逻辑,只需在get_context_data方法中完成以下操作:
实现步骤
- 调用父类的
get_context_data获取基础上下文 - 通过
self.get_object()获取当前Moc实例(该方法已做权限校验,无需额外处理) - 按照FBV中的逻辑计算时间差并转为字符串
- 将计算结果添加到上下文字典中
修改后的完整代码
import datetime # 确保文件顶部导入datetime模块 class MocDetailView(LoginRequiredMixin, DetailView): model = Moc template_name = 'moc/moc_detail.html' def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) # 获取当前Moc实例 moc = self.get_object() # 复用FBV的时间差计算逻辑 today = datetime.date.today() time = moc.initiation_date time_delta = today - time td = str(time_delta) # 将td加入上下文 context['td'] = td return context # 必须返回上下文 def get_object(self, queryset=None): obj = super().get_object(queryset=queryset) confidential = obj.confidential initiator = obj.initiator # 你的权限校验逻辑... if self.request.user.is_superuser or initiator == self.request.user or verifier or coordinator or reviewer or approver or preimplement or authorizer or postimplement or closer and confidential == True: return obj elif not confidential: return obj else: raise Http404()
补充说明
get_object方法已经完成了权限验证,直接调用该方法获取实例不会出现越权访问问题- 计算逻辑和FBV完全一致,保证了两处的时间差结果统一
内容的提问来源于stack exchange,提问作者SS_SS
相关产品推荐
相关产品推荐

