Django DetailView多表关联展示与**kwargs传参报错排查
问题1:解决user_id KeyError并正确关联User数据
你当前报错的核心原因是URL仅传递了Order的pk参数,self.kwargs里根本不存在user_id。正确的做法是先获取当前请求对应的Order实例,再通过它的外键关联拿到对应的User:
修改order/views.py的get_context_data方法:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 获取当前页面对应的Order对象 order = self.get_object() # 利用Django ORM的关联特性,直接从Order取对应的User(一个Order仅属于一个User) context['user'] = order.user return context
对应的模板order_show.html也可以简化(无需循环,因为是单个用户):
<p> Member: <li> <a href="{% url 'user:user_show' user.id %}">{{ user }}</a> </li> </p>
注:如果你的Order模型中外键字段定义为user_id(不推荐,Django外键默认会自动生成xxx_id字段,模型里应定义为user = models.ForeignKey(User, ...)),也可以用User.objects.get(id=order.user_id),但直接用order.user更符合Django的最佳实践。
问题2:模板中关联展示User对应的Company信息
由于User和Company是一对多关系(一个Company对应多个User),User模型里应该有指向Company的外键(比如company = models.ForeignKey(Company, ...)),在模板里直接通过已有的user对象链式访问关联的Company即可:
修改模板代码,添加Company信息展示:
<p> Member: <li> <a href="{% url 'user:user_show' user.id %}">{{ user }}</a> <br>所属公司:{{ user.company.name }} <!-- 假设Company模型有name字段 --> <!-- 如需跳转公司详情页,可添加链接 --> <br><a href="{% url 'company:company_show' user.company.id %}">查看公司详情</a> </li> </p>
如果需要展示Company的其他字段,直接链式访问即可,比如{{ user.company.address }}、{{ user.company.contact }}等。
内容的提问来源于stack exchange,提问作者Ilay
相关产品推荐
相关产品推荐

