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

Django如何获取外键关联的Bargain模型议价数据并在商品详情页展示

错误原因

你的实现有3个核心问题:

  • get_bargain方法定义时要求传入request参数,但模板中调用view.get_bargain没有传参,方法无法正常执行自然返回空
  • Django 1.10及以上版本中,request.user.is_authenticated是布尔属性不是可调用方法,加括号会始终返回False,导致即便是登录用户也不会触发议价查询逻辑
  • 完全不需要手动传递request参数:Django类视图实例自带self.request属性,可直接在自定义方法中调用

可行实现方案

方案1:重写get_context_data注入上下文(推荐)

这是Django类视图传递额外数据到模板的标准写法,逻辑清晰不易出错:
首先修改视图:

class ItemDetailView(DetailView):
    model = Item
    template_name = "product.html"
     
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 先判断用户登录
        if self.request.user.is_authenticated:
            # 查询当前用户对当前商品的议价记录
            context['user_bargain'] = Bargain.objects.filter(
                item=self.object, 
                user=self.request.user
            ).first()
        return context

然后修改模板的价格展示逻辑,加空值判断避免报错:

<span class="mr-1">
  <del>₹ {{ object.price }}</del>
</span>
<span>₹ 
  {% if user_bargain %}
    {{ user_bargain.bprice }}
  {% else %}
    {{ object.discount_price }}
  {% endif %}
</span>

方案2:调整原自定义方法适配调用规则

如果你不想改上下文注入,也可以直接修正原get_bargain方法的问题:
修改视图方法,去掉request参数,直接调用self.request,修正is_authenticated写法:

class ItemDetailView(DetailView):
    model = Item
    template_name = "product.html"
     
    def get_bargain(self):
        if self.request.user.is_authenticated:
            return Bargain.objects.filter(item=self.object, user=self.request.user).first()
        return None

模板中调整调用逻辑,加空值判断:

<span class="mr-1">
  <del>₹ {{ object.price }}</del>
</span>
<span>₹ 
  {% with bargain=view.get_bargain %}
    {{ bargain.bprice if bargain else object.discount_price }}
  {% endwith %}
</span>

内容的提问来源于stack exchange,提问作者Amaeraa Sethi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:54:03