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

如何在Django订单面板模板中显示对应产品名称?

在Django模板中显示订单对应的产品名称

一、规范解决方案:将productfk改为ForeignKey关联

当前你的Orders模型用IntegerField存储产品ID,这不符合Django处理模型关联的标准方式。改成ForeignKey不仅能自动处理关联查询,还能保证数据一致性(避免出现不存在的产品ID)。

1. 修改Orders模型

把原模型中的productfk = models.IntegerField()替换为:

productfk = models.ForeignKey(to=Product, on_delete=models.CASCADE, db_column='productfk')
  • db_column='productfk'用于兼容已有的数据库字段名,避免迁移时修改字段结构
  • 执行python manage.py makemigrations和migrate完成数据库迁移

2. 优化视图查询

在获取订单时,通过select_related提前关联Product和User,避免模板渲染时出现N+1查询问题;同时必须过滤当前登录用户的订单,防止泄露其他用户数据:

@login_required(login_url='/authentication/login')
def index(request):
    unit=Unit.objects.all()
    orderstatus=OrderStatus.objects.all()
    # 只查询当前用户的订单,同时预关联用户和产品
    orders = Orders.objects.select_related('customerfk', 'productfk').filter(customerfk=request.user)
    
    paginator = Paginator(orders,20)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    context={
        'order':orders,
        'orderstatus':orderstatus,
        'unit':unit,
        'page_obj':page_obj
    }
    return render(request,'orders/index.html',context)

3. 模板中调用产品名称

在模板循环订单时,直接通过关联对象获取产品名称:

{% for order in page_obj %}
    <div class="order-item">
        <p>订单编号:{{ order.id }}</p>
        <p>产品名称:{{ order.productfk.name }}</p>
        <p>订单状态:{{ order.status }}</p>
        <!-- 其他订单字段按需添加 -->
    </div>
{% endfor %}

二、临时兼容方案(不修改模型结构)

如果因为历史数据、业务限制等原因无法修改模型,可以用以下两种方式临时解决:

方式1:在模型中添加获取产品名称的方法

给Orders模型新增一个方法,用于查询对应产品名称:

class Orders(models.Model):
    # 原有字段保持不变
    
    def get_product_name(self):
        try:
            return Product.objects.get(id=self.productfk).name
        except Product.DoesNotExist:
            return "未知产品"

模板中直接调用该方法:

{{ order.get_product_name }}

⚠️ 注意:这种方式会导致每个订单触发一次数据库查询,数据量大时性能极差,仅适合小规模场景。

方式2:在视图中批量预查询产品

通过批量查询产品并映射的方式,避免N+1问题:

@login_required(login_url='/authentication/login')
def index(request):
    unit=Unit.objects.all()
    orderstatus=OrderStatus.objects.all()
    # 过滤当前用户的订单
    orders = Orders.objects.filter(customerfk=request.user)
    
    # 提取所有订单的产品ID,批量查询产品
    product_ids = [order.productfk for order in orders]
    product_map = {p.id: p.name for p in Product.objects.filter(id__in=product_ids)}
    
    # 给每个订单添加产品名称属性
    for order in orders:
        order.product_name = product_map.get(order.productfk, "未知产品")
    
    paginator = Paginator(orders,20)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    
    context={
        'order':orders,
        'orderstatus':orderstatus,
        'unit':unit,
        'page_obj':page_obj
    }
    return render(request,'orders/index.html',context)

模板中直接调用预添加的属性:

{{ order.product_name }}

内容的提问来源于stack exchange,提问作者franchesco totti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:26:20