Django Ajax创建帖子后如何以纯文本更新Div?
解决Ajax新增帖子时HTML标签被渲染的问题
这问题我之前开发类似功能时也踩过坑!核心原因很简单:你当前用html()方法插入新帖子内容,它会把传入的字符串当作HTML代码解析渲染,而页面刷新后Django模板默认会自动转义HTML特殊字符,所以才会出现“提交后渲染成格式、刷新后显示原始文本”的不一致情况。
最快的修复方案:改用text()方法插入内容
直接修改你Ajax回调里的代码,把解析HTML的html()换成纯文本插入的text():
success: function(data){ $('#id_title').val(''); console.log(data.title); // 把html()改成text(),确保内容以纯文本形式展示 $('#post_title_content').text(data.title); // 如果是要把新帖子追加到列表末尾(而不是替换现有内容),可以用下面的写法: // $('#post_title_content').append($('<div class="post-item">').text(data.title)); },
为什么这样有效?
text()方法会自动将字符串中的HTML特殊字符(比如<、>、&)转义成对应的HTML实体(<、>、&),浏览器收到这些实体后会直接显示原始字符,而不会把它们当作HTML标签解析渲染。
可选的后端补充方案(双重保险)
如果你想在后端也做一层转义,避免前端万一出错导致的XSS风险,可以在Django视图里对标题进行HTML转义:
from django.utils.html import escape def post_create_ajax(request): if request.is_ajax() and request.method == 'POST': title = request.POST.get('the_post') author = request.user post = Post(title=title, author=author) post.save() # 转义后再返回 return JsonResponse({'title': escape(title)})
这样即使前端不小心用了html(),也会显示纯文本。不过更推荐前端用text()的方案,因为展示层的逻辑交给前端处理更合理。
内容的提问来源于stack exchange,提问作者Bidhan Majhi
相关产品推荐
相关产品推荐

