Django 2.1,如何在模板中显示外键值?

时间:2018-10-23 09:58:31

标签: django python-3.x

对不起,我的英语水平和我的模特都不好。

现在,我被困在模板中显示价值。

purchaseinfo / models.py

class Status(Models.model):         
    type = models.CharField(max_length=30)

class PurchaseInfo(models.Model):
    purchase_id = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    purchase_name = models.CharField(max_length=30)
    .....
    type = models.ForeignKey(Status,on_delete=models.PROTECT)

customlogin / views.py

def purchaseHistory(request):
    history = PurchaseInfo.objects.filter(purchase_id=request.user).values()
    return render(request,'customlogin/purchaseHistory.html',{'history':history})

customlogin / purchaseHistory.html

{% for i in history %}
<tr>
    <td>{{i.purchase_name}}</td>
    <td>{{i.product_price}}</td>
    ......
    <td>{{i.type}}</td>   <---- Here, Only this cannot show
</tr>
{% endfor %}

在模板中,其他功能运行良好。但是 {{i.type}} 无法显示。

类别状态的值:存款之前,付款确认等。

存款前为基础价值。所以我想在模板中显示基本价值。

如何在模板中显示{{i.type}}? T.T

1 个答案:

答案 0 :(得分:2)

该错误是由于以下事实造成的:您在末尾用QuerySet调用.values(),因此将获得QuerySet的字典。 无法解析外键,但是您可以获取相应的主键。

最好仅在真正需要时使用.values():当您要获取列的子集时。通常,最好获取模型对象,因为这样,您附加到对象的“行为”将保持不变。

def purchaseHistory(request):
    # no .values()
    history = PurchaseInfo.objects.filter(purchase_id=request.user)
    return render(request,'customlogin/purchaseHistory.html',{'history':history})

现在,我们已经创建了QuerySetPurchaseInfo对象,在模板中,i.type将是Status对象。这将通过调用Status对象来渲染str(..)对象。默认情况下,其外观类似于Status object (123)123

不过,您也可以访问模板中此Status对象的字段:

{% for i in history %}
<tr>
    <td>{{ i.purchase_name }}</td>
    <td>{{ i.product_price }}</td>
    ......
    <td>{{ i.type.type }}</td>
</tr>
{% endfor %}

鉴于该字段的名称为type,因此,如果该字段包含值'Before deposit',它将呈现该字符串。

由于我们在这里将为查询集中的每个 Status对象获取相关的PurchaseInfo对象,因此最好在一个查询中获取它,例如:

def purchaseHistory(request):
    # no .values()
    history = PurchaseInfo.objects.filter(purchase_id=request.user).select_related('type')
    return render(request,'customlogin/purchaseHistory.html',{'history':history})

您可能想覆盖__str__类中的Status方法,以使这是呈现状态的“标准”方式,例如:

class Status(Models.model):         
    type = models.CharField(max_length=30)

    def __str__(self):
        return self.type

在这种情况下,模板中的{{ i.type }}就足够了。