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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 06:12:09