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

Django博客如何在文章内容中嵌入<pre>代码片段?

Django博客实现代码块格式(无需富文本字段)

方案1:自定义模板过滤器识别简单标记

给输入内容约定一个简易标记(比如用三个反引号```包裹代码段),通过自定义模板过滤器把这些标记转换成<pre><code>标签,同时保留普通文本的换行和空格。

操作步骤:

  1. 在你的app目录下创建templatetags文件夹(必须添加空的__init__.py文件),新建custom_filters.py文件:
from django import template
from django.utils.safestring import mark_safe
import re

register = template.Library()

@register.filter(name='render_with_code_blocks')
def render_with_code_blocks(text):
    # 匹配```包裹的跨行代码块
    code_regex = re.compile(r'```(.*?)```', re.DOTALL)
    # 替换为预格式标签
    processed_text = code_regex.sub(r'<pre><code>\1</code></pre>', text)
    # 处理普通文本的换行和空格
    processed_text = processed_text.replace('\n', '<br>')
    processed_text = processed_text.replace(' ', '&nbsp;')
    return mark_safe(processed_text)
  1. 在展示文章的模板中加载过滤器并使用:
{% load custom_filters %}

<div class="article-content">
    {{ article.body|render_with_code_blocks }}
</div>

用户输入时,只需把代码用```包裹,就能生成预格式代码块,其他文本正常保留换行和空格。

方案2:用简易分隔符标记代码块

如果不想用正则,也可以用更直观的分隔符(比如[code]和[/code]),过滤器代码更简洁:

@register.filter(name='simple_code_format')
def simple_code_format(text):
    chunks = text.split('[code]')
    output = []
    for idx, chunk in enumerate(chunks):
        if idx % 2 == 1:
            # 分隔符之间的内容是代码块
            code_part, rest = chunk.split('[/code]', 1)
            output.append(f'<pre><code>{code_part}</code></pre>')
            # 处理代码块后的普通文本
            output.append(rest.replace('\n', '<br>'))
        else:
            output.append(chunk.replace('\n', '<br>'))
    return mark_safe(''.join(output))

输入示例:

这是一篇Python教程笔记,下面是示例代码:
[code]
def calculate_sum(a, b):
return a + b
print(calculate_sum(2, 3))
[/code]
以上就是基础的求和函数实现。

注意事项

  • 使用mark_safe要注意安全,如果博客允许匿名投稿,建议配合bleach库过滤危险HTML标签,避免XSS攻击。
  • 两个方案都不需要修改现有模型字段,也无需引入富文本编辑器,用户只需记住简单标记即可实现代码块格式。

内容的提问来源于stack exchange,提问作者blueberry.py

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:55:16