为什么在'POST'或'GET'请求后,django模板中缺少一个'新行'?

时间:2013-03-21 17:45:04

标签: html textarea html-parsing

表单验证后,我的textarea丢失了第一行。

显示textarea的结果页面对应于相同的视图,模板作为用户输入数据的页面。换句话说,页面是相同的。

在我的代码中,我有类似的东西:

if request.method == 'POST':
    f = MyForm( request.POST )
    if f.is_valid(): # f is a form
        context.update( value = f.cleaned_data[ 'value' ] )
        # then 'value' becomes a 'value' context variable for a template.

模板中的片段:

...
<textarea name='value'>{{value}}</textarea> 
<!-- It's a template for a result page -->
...

有趣的是,如果textarea在开头有很多'\ n'行,那么对于每个'POST'请求,它会在结果页面中丢失其中一个(并且其中一个)发布的数据显示在textarea中。

有人可以帮忙吗?如何在没有黑客代码的情况下解决问题?

我希望textarea显示用户在上一页上输入的所有开头'\ n'行。

更多

数据来自客户端 - 如果我们在视图中输出'value',则不会丢失任何换行符。问题是要在模板中进一步显示。

环境:Windows,Firefox / Opera。

3 个答案:

答案 0 :(得分:1)

你确定这是Django特有的吗?

<html>
<body>
<textarea>`[CR]LF`
`[CR]LF`
test</textarea>    
</body>
</html>

保存为普通.html文件时,浏览器中只有一个换行符。浏览器将第一个换行符视为“HTML代码格式化”,而不是值的一部分。

修改

您应该可以通过修改模板来解决此问题:

<textarea name='value'>
{{value}}</textarea> 
<!-- It's a template for a result page -->

只有第一个后面的换行符显示在框中(例如,如果你有3个,你得到2个,如果你有2个得到1,如果你得到1得到0,如果你得到0则得到0)。这是因为浏览器会将第一个换行符作为标记的一部分使用,因此将模板更改为已包含此第一个换行符应解决您的问题。

答案 1 :(得分:0)

我认为浏览器忽略/ n作为html中的新行渲染文本? html使用

<br>

换新行。要呈现一个文本块,您可以将其作为列表包含在表单中,其中每行数据都是一个新的列表项,然后使用以下内容在模板中呈现:

{{ text_list|join:"<br>"}}

/ n将保留在您的文本中,因此您仍然可以将其用于正则表达式等...

答案 2 :(得分:0)

你能尝试下面的代码吗,我遇到了类似的问题,这就是我解决它的方法。

<pre>{{text_list|safeseq|join:"\r\n"}}</pre> 
<p>{{text_list|safeseq|join:"\n"}}</p>
<p><pre>{{text_list|safeseq|join:"\r\n"}}</p> 

LMK