Django视图中外键显示为对象而非customerid的问题求助
解决Django模板中外键显示为“Customers object”的问题
嘿,这问题我之前也碰到过!原因很简单:你的order.customerid其实是一个Customers模型的实例对象,而不是直接的ID值。Django默认会调用模型的__str__()方法来输出实例,默认的__str__就是返回“模型名 object”,所以才会显示成“Customers object”。
下面给你几个靠谱的解决方案,按优雅程度排序:
方法1:给Customers模型添加自定义的__str__方法(推荐)
这是一劳永逸的做法,以后任何地方输出Customers实例都会显示你想要的内容。修改你的models.py里的Customers类:
class Customers(models.Model): customerid = models.AutoField(primary_key=True) fname = models.CharField(max_length=50, blank=True, null=True) lname = models.CharField(max_length=50, blank=True, null=True) # ... 其他字段保持不变 def __str__(self): # 这里可以返回customerid,或者组合姓名(比如return f"{self.fname} {self.lname}") return str(self.customerid) class Meta: managed = False db_table = 'customers'
改完之后,模板里原来的{{ order.customerid }}就会直接显示对应的customerid数值了。
方法2:在模板中直接访问外键实例的customerid字段
如果不想修改模型,也可以在模板里直接指定要显示的字段:
<p><strong> {{ order.customerid.customerid }} <br> {{ order.orderid }} <br> </strong> <br>
注意这里是order.customerid.customerid:第一个customerid是Orders模型里的外键字段名,第二个customerid是Customers模型里的主键字段名。
方法3:在视图中预先处理数据(不推荐,没必要)
你之前想在视图里处理,其实完全没必要,不过还是给你举个例子,比如把customerid单独提取出来放到每个order对象里:
def orders(request): orders = Orders.objects.all() for order in orders: # 给每个order对象加一个customer_id属性,判断避免空值报错 order.customer_id = order.customerid.customerid if order.customerid else None context = {'orders': orders} return render(request,'albums/orders.html', context)
然后模板里用{{ order.customer_id }}来显示,但这种方法不如前两种简洁,不推荐使用。
总结一下,最推荐的是方法1,既优雅又能统一所有地方的显示效果~
内容的提问来源于stack exchange,提问作者Koji Inoue
相关产品推荐
相关产品推荐

