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

如何在Django类视图DetailedView中获取当前请求的pk值?

解决Django DetailView中获取URL路径pk的问题

嘿,我明白你的问题了——你现在把pk固定成1,所以不管访问哪个<int:pk>的URL,都只会显示同一件商品对吧?其实Django的DetailView已经帮你做了大部分工作,不用手动重复查询的,下面给你两种解决方法:

方法一:直接使用DetailView已获取的对象

DetailView在执行到get_context_data之前,已经根据URL里的pk参数查询到了对应的Producto对象,并且把它存在了self.object属性里。所以你完全可以直接复用这个对象,不用再调用Producto.objects.get():

class DetailedView(DetailView):
    model = Producto
    template_name = 'shop/specific_view.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 直接使用已经查询好的对象,避免重复数据库查询
        context['determinado'] = self.object
        return context

方法二:从URL参数中获取pk

如果你确实需要手动获取URL里的pk值(比如要做其他关联查询),可以通过self.kwargs来获取——类视图会把URL中捕获的参数都存在这个字典里:

class DetailedView(DetailView):
    model = Producto
    template_name = 'shop/specific_view.html'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 从kwargs中取出URL里的pk参数
        current_pk = self.kwargs['pk']
        context['determinado'] = Producto.objects.get(pk=current_pk)
        return context

注意:方法一更好,因为它复用了DetailView已经完成的数据库查询,避免了不必要的重复查询,性能更优。

另外补充一下,DetailView默认会把查询到的对象放到context里,键名是object,或者是你的model名的小写(也就是producto),所以在模板specific_view.html里,你其实可以直接用{{ object }}或者{{ producto }}来访问当前商品,不一定非要自己加determinado这个键哦。

内容的提问来源于stack exchange,提问作者Guillermo Vázquez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 18:47:31