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

如何在Django ListView中修改对象字段?实现文本截断展示

Django ListView截断文本字段(不修改数据库)

有两种常用方法可以实现需求,既不改动数据库,又能展示截断后的文本:

方法一:重写get_queryset(数据库层面处理)

如果你想在视图层统一处理,可以通过get_queryset结合数据库函数给查询集添加一个截断后的字段,模板直接调用该字段即可:

首先导入所需模块:

from django.db.models.functions import Substr
from django.views.generic import ListView
from .models import Blog  # 替换成你的博客模型类

然后重写ListView的get_queryset方法:

class BlogListView(ListView):
    model = Blog
    template_name = "blog/blog_list.html"  # 替换成你的模板路径
    context_object_name = "blog_list"

    def get_queryset(self):
        # 先获取原始查询集
        queryset = super().get_queryset()
        # 用Substr函数截取text字段的前100个字符,命名为truncated_text
        queryset = queryset.annotate(
            truncated_text=Substr("text", 1, 100)
        )
        return queryset

之后在模板里直接调用新增的字段:

{% for blog in blog_list %}
    <h3>{{ blog.title }}</h3>
    <p>{{ blog.truncated_text }}{% if blog.text|length > 100 %}...{% endif %}</p>
{% endfor %}

方法二:模板过滤器直接处理(更简单)

如果不需要在视图层做额外逻辑,直接在模板里用Django内置的truncatechars过滤器就能快速实现:

{% for blog in blog_list %}
    <h3>{{ blog.title }}</h3>
    <p>{{ blog.text|truncatechars:100 }}</p>
{% endfor %}

这个过滤器会自动截断到指定长度,并在末尾添加省略号,无需手动处理。

两种方法对比:

  • 方法一更适合需要在视图层复用截断后内容的场景,数据库层面处理性能更优;
  • 方法二代码量更少,适合快速实现简单需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 09:55:31