Django博客自定义模板标签报错:期望字符串却得到QuerySet
解决Django自定义模板标签报错:
expected string or bytes-like object, got 'QuerySet' 错误原因
你的FewFirst标签逻辑存在两个核心问题:
blogdata.objects.values_list('content')返回的是QuerySet对象(包含所有博客content字段的列表集合),而re.findall要求传入字符串,直接传入QuerySet自然触发类型错误。- 当前逻辑未明确指定处理哪一篇博客的内容,不符合博客场景的常规需求——通常是提取单篇博客的前N个词,而非所有博客内容混编。
修正方案
场景1:提取单篇博客的前10个词(推荐)
修改post_tags.py,让标签接收具体的博客实例作为参数:
import re from django import template from ..models import blogdata register=template.Library() @register.simple_tag def FewFirst(blog_post): # 处理content为空的边界情况 if not blog_post.content: return "" # 提取前10个词并拼接 word_list = re.findall(r'\w+', blog_post.content)[:10] return " ".join(word_list)
在模板中使用时,传入具体的博客对象(假设视图传递的单篇博客变量名为post):
{% load post_tags %} {{ FewFirst post }}
场景2:提取所有博客内容的前10个词(特殊需求)
如果确实需要合并所有博客内容再提取,需先将QuerySet中的字符串拼接为单个字符串:
import re from django import template from ..models import blogdata register=template.Library() @register.simple_tag def FewFirst(): # 过滤空内容,拼接所有有效content valid_contents = [item[0] for item in blogdata.objects.values_list('content') if item[0]] full_content = " ".join(valid_contents) # 提取前10个词 word_list = re.findall(r'\w+', full_content)[:10] return " ".join(word_list)
内容的提问来源于stack exchange,提问作者deadlock
相关产品推荐
相关产品推荐

