在 内部渲染标记<textarea>添加换行符



我正在用Django实现一个类似维基百科的网络应用程序。不同条目的数据存储在服务器上的Markdown文件中。我使用markdown2进行转换。一切都很好,但当我试图编辑现有条目时遇到了问题。服务器提供";edit.html";向客户端传递一个用现有数据填充的django表单。

视图.py

class EditPageForm(forms.Form):
title = forms.CharField(widget=forms.HiddenInput, label="title")
content = forms.CharField(widget=forms.Textarea, label="content"
def edit(request):
if request.method == "POST":
form = SearchForm(request.POST) ## a form with only a "title" input
if form.is_valid():
title = form.cleaned_data["title"]
content = util.get_entry(title) ## read the existing file.md
form = EditPageForm(initial={
"title": title,
"content": content
})
return render(request, "encyclopedia/edit.html", {
"title": title,
"form": form
})

edit.html

<h1>Edit content for "{{ title }}"</h1>
<form action="{% url 'save' %}" method="post">
{% csrf_token %}
{{ form }} ## undesired newlines added here
<input type="submit" value="Save">
</form>

当浏览器呈现包含要编辑的数据的文本区域时,会在未经我同意的情况下插入换行符。每当我编辑文本时,这种行为就会循环,从而添加越来越多的换行符。我真的不明白发生了什么。有人知道吗?

我认为这是转换器中的一个bug/特性。我也遇到了同样的问题,文本区域中的空行在重复提交后呈指数级增长(在编辑视图中(。找不到此行为的任何原因。

如果你自己尝试转换为HTML,可能会得到不同的结果,但我自己真的不想经历regex的痛苦。

然而,当我提交该项目时,它仍然获得了及格分数

我在同一个项目CS50X上工作,遇到了同样的问题。不幸的是@lukas解决方案对我不起作用。

我的解决方案是修复文件在utils.py中的保存方式,特别是save_entry函数。我将其修改为:

default_storage.save(filename, ContentFile(content.encode('ascii')))

这阻止了CR和LF的翻倍。

感谢Doug Forbes的解决方案

Pythonrepr()允许在转义每个特殊字符的同时打印字符串,非常方便调试!我发现我的代码——出于某种不清楚的原因——通过添加序列rrn在换行符上加倍。所以最后我只是使用regex在每次编辑时去掉所有不需要的字符。因此,我在视图中修改了以下内容。py

# read the existing file.md and substitute all undesired characters
content = re.sub('(rrn)+', 'n', util.get_entry(title))

希望将来有人受益!

最新更新