如何通过添加 <span> 来修改 Django 内容的某些部分,同时保持段落文本的原始格式?

Posted

技术标签:

【中文标题】如何通过添加 <span> 来修改 Django 内容的某些部分,同时保持段落文本的原始格式?【英文标题】:How to modify certain part of Django content by adding <span>, while keeping the original format of paragraph text? 【发布时间】:2016-05-23 01:58:21 【问题描述】:

我正在尝试显示来自 django 的一段文本 (content),但我想将 &lt;span class="modify"&gt; 添加到该段落中的特定单词(以与 referenceList 中的预定义单词匹配的为准)。

这是我的观点.py:

def post_content(request, id=None):
    instance = get_object_or_404(post, id=id)
    content = instance.content.split()
    referenceList = ["customer","sales","service","management"]
    context = 
        "title": instance.title,
        "instance": instance,
        "content": content,
        "referenceList": referenceList
    
    return render(request,"get_post_content.html",context)

这是我的 get_post_content.html:

<!--DOCTYPE html-->
<html>
<style type="text/css">
    .modify
        color: blue;
    
</style>
<body>
    <h1> instance.title </h1>
     instance.author <br/>
    <pre class="postContent">
        % for obj in content % 
                % if obj in referenceList %
                    <span class="modify"> obj </span>
                % else %
                     obj 
                % endif %
        % endfor %
    </pre>  
</body> 
</html>

这能够区分单词并更改为我想要的 css,但它只是遍历并显示字符串列表,所有空格和 '\n' 都丢失了。有没有办法保持文本的原始格式(保留空格和'\n')? 提前致谢!!

【问题讨论】:

我建议不要在模板中使用splitting 内容和解析; (1) 使用正则表达式在视图本身内对其进行修改,或者 (2) 创建自定义模板过滤器 【参考方案1】:
>>> def add_span(arg)
>>>     return  '<span class="modify">  %s </span>'%arg.string[arg.regs[0][0]:arg.regs[0][1]] 
>>> import re
>>> r = re.compile("foo|baz")
>>> content = "Once upon a time foo met baz"
>>> print r.sub(add_span,content)
Once upon a time <span class="modify">  foo </span> met <span class="modify">  baz </span>

然后编辑您的视图代码。使用表单进行验证,因为当您添加跨度时,您必须将标签标记为安全,否则 django 将转义它:

    import re
    from django import forms

    def add_span(arg)
        return  '<span class="modify">  %s </span>'%arg.string[arg.regs[0][0]:arg.regs[0][1]] 
    r = re.compile("customer|sales|service|management")

    class ValidateRefList(Form):

       content = forms.CharField()

       def save(self):
          return r.sub(add_span,self.cleaned_data['content'])

    def post_content(request, id=None):
        instance = get_object_or_404(post, id=id)
        f = ValidateRefList('content':instance.content)
        if f.is_valid():
            fixed_content = f.save()
        else:
            # do something else
        context = 
            "title": instance.title,
            "instance": instance,
            "content": fixed_content   
        
        return render(request,"get_post_content.html",context)

最后,在您的模板中,只需:

 content|safe 

【讨论】:

感谢您的帮助,%arg.string[arg.regs[0][0] 中的 arg.regs[0][0] 和 arg.regs[0][1] 是什么: arg.regs[0][1]] 很高兴它回答了您的问题。当您使用函数运行 sub 时,它会向它发送一个匹配的对象,并找到原始字符串。 regs 是在原始字符串中找到匹配位置的元组

以上是关于如何通过添加 <span> 来修改 Django 内容的某些部分,同时保持段落文本的原始格式?的主要内容,如果未能解决你的问题,请参考以下文章

Wordpress如何通过添加额外的html属性来修改页面的<body>标签

如何用js将一个<span>中的内容加入到另一个<span中>

TinyMCE 的removeformat插件会给数字和字母会自动添加<span lang="EN-US"></span>,如何设置不会添加?

如何让屏幕阅读器不间断地通过 <span>

如何将类添加到特定的 html 元素,如果它们包含某个值

如何在 MVC 视图中添加时钟