python 在Django中提交并保存后,markdown文件中会出现额外的空行

mi7gmzs6  于 2023-05-16  发布在  Python
关注(0)|答案(1)|浏览(144)

我在保存用户提交的信息时遇到问题。我的网站的页面之一应该有一个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中的新行编码的差异。在下面的答案中阅读更多。

crcmnpdw

crcmnpdw1#

在我看来,这是新行编码方式的差异。实际上,Windows使用carriage return ( \r ) [wiki],然后使用 * 换行符 *(\n)[wiki],而Linux和Mac OS X仅使用换行符(\n)。现在,某些系统通常也会将其解释为新行。但这是“渲染”,而不是“内容”。您查看文件的编辑器可能在\n或LF或Linux上设置了行尾。
但是,您可以在保存输入之前使用以下命令清理输入:

def index(request):
    if 'title' in request.POST and 'content' in request.POST:
        save_data(
            request.POST['title'], request.POST['content'].replace('\r\n', '\n')
        )
    return render(request, "my_app/page.html")

注意:请使用request.POST['content'],而不是request.POST.get('content')。使用.get(…)通常只能隐藏错误,而不能隐藏问题:实际上,如果密钥丢失,它将工作。但如果确实需要该键的值,则只会在稍后的过程中导致更多的麻烦。

相关问题