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

如何在Django的IndexView视图中同时使用Goods和Number两个模型?

实现方案

一、先优化models.py冗余代码

你当前每个模型重复定义了多次__str__方法,后定义的会覆盖之前的逻辑,仅最后一个会生效,调整后代码如下:

from django.db import models

class Goods(models.Model):
    description_text = models.CharField(max_length=200)
    price_text = models.CharField(max_length=200)
    image_sale = models.ImageField()

    def __str__(self):
        # 按需保留一个返回值即可,示例返回商品描述
        return self.description_text


class Number(models.Model):
    number1_text = models.CharField(max_length=200)
    number2_text = models.CharField(max_length=200)

    def __str__(self):
        # 按需保留一个返回值即可
        return self.number1_text

二、修改IndexView支持双模型数据

Django自带的ListView默认仅支持单模型查询,你可以重写get_context_data方法手动把Number模型的数据加入上下文,不需要单独创建NumbersView:

from django.views import generic
from .models import Goods, Number
# 如果你没有用到Question、timezone,可以把对应的导入直接删掉

class IndexView(generic.ListView):
    template_name = 'Homepage/index.html'
    model = Goods
    context_object_name = 'goods'

    def get_context_data(self, **kwargs):
        # 先获取父类生成的默认上下文(包含goods数据)
        context = super().get_context_data(**kwargs)
        # 把Number模型的所有数据加入上下文
        context['numbers'] = Number.objects.all()
        return context

你原来写的description、price、number1、number2方法完全不需要,模板可以直接读取模型实例的字段属性。

三、模板调用示例

在Homepage/index.html里可以直接调用两个模型的数据:

<!-- 遍历展示商品 -->
{% for good in goods %}
    <p>商品描述:{{ good.description_text }}</p>
    <p>商品价格:{{ good.price_text }}</p>
    <img src="{{ good.image_sale.url }}" alt="{{ good.description_text }}">
{% endfor %}

<!-- 遍历展示数字 -->
{% for num in numbers %}
    <p>数字1:{{ num.number1_text }}</p>
    <p>数字2:{{ num.number2_text }}</p>
{% endfor %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:05