如何在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
相关产品推荐
相关产品推荐

