我在保存用户提交的信息时遇到问题。我的网站的页面之一应该有一个markdown文本的textarea。用户在此区域输入的数据应在提交后保存在单独的文件中。但是当我在提交后打开保存的文件时,有额外的空行。views.py和HTML表单中的函数如下所示。
from django.shortcuts import render
from django.core.files.base import ContentFile
from django.core.files.storage import default_storage
def index(request):
if request.method == "POST":
save_data(request.POST.get("title"), request.POST.get("content"))
return render(request, "my_app/page.html")
def save_data(title, content):
filename = f"files/{title}.md"
if default_storage.exists(filename):
default_storage.delete(filename)
default_storage.save(filename, ContentFile(content))
<form method="post">
{% csrf_token %}
<label for="title">Enter a title:</label><br>
<input id="title" type="text" name="title">
<br><br><label for="textarea">Enter the information:</label><br>
<textarea id="textarea" name="content"></textarea><br><br>
<input type="submit" value="Save Page">
</form>
例如,如果我尝试在textarea中键入以下文本:
# My file
This is markdown file.
This file was created as an example for my question.
我在提交后看到:
# My file
This is markdown file.
This file was created as an example for my question.
你能帮我解决这个问题吗?感谢您的评分
问题解决方案:
好了,如果您尝试使用print(repr(request.POST['content']))
,问题的本质就变得清楚了。执行此命令后,您将获得# My file\r\n\r\nThis is markdown file.\r\nThis file was created as an example for my question.
。因此,问题在于Windows和Linux/Mac OS中的新行编码的差异。在下面的答案中阅读更多。
1条答案
按热度按时间crcmnpdw1#
在我看来,这是新行编码方式的差异。实际上,Windows使用carriage return (
\r
) [wiki],然后使用 * 换行符 *(\n
)[wiki],而Linux和Mac OS X仅使用换行符(\n
)。现在,某些系统通常也会将其解释为新行。但这是“渲染”,而不是“内容”。您查看文件的编辑器可能在\n
或LF或Linux上设置了行尾。但是,您可以在保存输入之前使用以下命令清理输入:
注意:请使用
request.POST['content']
,而不是request.POST.get('content')
。使用.get(…)
通常只能隐藏错误,而不能隐藏问题:实际上,如果密钥丢失,它将工作。但如果确实需要该键的值,则只会在稍后的过程中导致更多的麻烦。