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
相关产品推荐
相关产品推荐

