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

如何在Django中创建模型记录队列并按发布顺序依次展示

Django按顺序展示模型队列记录实现方案

示例参考图


现有代码问题提前修正

  • 模型Goods中定义了多个__str__方法,Python类中同名方法会被后续定义覆盖,仅最后一个生效,建议仅保留1个,比如返回商品描述+发布时间方便调试
  • 当前get_queryset仅返回了1条数据,无法满足多块展示需求
  • 模板中循环调用的变量名是queryset,和视图定义的context_object_name: goods不一致,会出现取值为空的问题

具体实现步骤

1. 调整视图逻辑

首先根据你的展示块数量调整查询集返回条数,按「最先注册的排在最前」的需求,pub_date采用升序排序:

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

    def get_queryset(self):
        # pub_date升序:发布时间越早(注册越早)的排在最前面,这里假设你有3个展示块,取前3条
        # 如果需要最新注册的排在第一个块,把'pub_date'改成'-pub_date'即可
        return Goods.objects.order_by('pub_date')[:3]
    
    # 可选:将不同位次的记录单独传入上下文,模板可以直接调用不用判断索引
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        queryset = self.get_queryset()
        if len(queryset) >= 1:
            context['first_good'] = queryset[0]
        if len(queryset) >= 2:
            context['second_good'] = queryset[1]
        if len(queryset) >= 3:
            context['third_good'] = queryset[2]
        return context

2. 模板渲染

方式1:直接调用单独上下文变量(无需循环,逻辑更清晰)

<!-- 第一个展示块:最先注册的记录 -->
<div class="show-block first">
    <h1 class="price">{{ first_good.price_text }}</h1>
    <p>{{ first_good.description_text }}</p>
    <img src="{{ first_good.image_sale.url }}" alt="{{ first_good.description_text }}">
</div>

<!-- 第二个展示块:第二条记录 -->
<div class="show-block second">
    <h1 class="price">{{ second_good.price1_text }}</h1>
    <p>{{ second_good.description1_text }}</p>
    <img src="{{ second_good.image1_sale.url }}" alt="{{ second_good.description1_text }}">
</div>

<!-- 第三个展示块:第三条记录 -->
<div class="show-block third">
    <h1 class="price">{{ third_good.price2_text }}</h1>
    <p>{{ third_good.description2_text }}</p>
    <img src="{{ third_good.image2_sale.url }}" alt="{{ third_good.description2_text }}">
</div>

方式2:循环判断位次

{% for good in goods %}
    {% if forloop.counter == 1 %}
    <!-- 第一个展示块 -->
    <div class="show-block first">
        <h1 class="price">{{ good.price_text }}</h1>
    </div>
    {% elif forloop.counter == 2 %}
    <!-- 第二个展示块 -->
    <div class="show-block second">
        <h1 class="price">{{ good.price1_text }}</h1>
    </div>
    {% elif forloop.counter == 3 %}
    <!-- 第三个展示块 -->
    <div class="show-block third">
        <h1 class="price">{{ good.price2_text }}</h1>
    </div>
    {% endif %}
{% endfor %}

可选优化:模型结构调整

你当前的Goods模型把三套商品字段都写在同一个类里,扩展性很差,后续新增展示块还要修改模型字段。建议拆分重复字段,每个商品对应一条独立记录:

class Goods(models.Model):
    description_text = models.CharField(max_length=200)
    price_text = models.CharField(max_length=200)
    image_sale = models.ImageField(blank=True, upload_to='images/')
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.description_text

后续新增商品直接新增记录即可,不用调整模型结构,更符合Django的设计规范。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:54:03