Django博客如何在文章内容中嵌入<pre>代码片段?
Django博客实现代码块格式(无需富文本字段)
方案1:自定义模板过滤器识别简单标记
给输入内容约定一个简易标记(比如用三个反引号```包裹代码段),通过自定义模板过滤器把这些标记转换成<pre><code>标签,同时保留普通文本的换行和空格。
操作步骤:
- 在你的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(' ', ' ') return mark_safe(processed_text)
- 在展示文章的模板中加载过滤器并使用:
{% 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
相关产品推荐
相关产品推荐

