在Django中创建视图(字符串缩进问题)

0 投票
2 回答
1248 浏览
提问于 2025-04-16 06:00

我刚接触Python和Django,但之前有编程经验。

我在视图中的缩进问题上遇到了很多麻烦。我想动态生成我的HTML,这就需要大量的字符串处理。显然,我不能把整个HTML页面写在一行里。那么,为了能够动态构建一个HTML字符串,也就是把字符串和其他变量混合在一起,我需要做些什么呢?

举个例子,使用PHP,下面这个简单的例子展示了如何生成一个包含表格的HTML文档。

<?php 
$output = '<html><head><title>Getting worked up over Python indentations</title></head><body>';

output .= '<table><tbody>'
for($i=0; $i< 10; $i++){
   output .= '<tr class="'.(($i%2) ? 'even' : 'odd').'"><td>Row: '.$i;
}
$output .= '</tbody></table></body></html>'

echo $output;

我想在Python(在我的views.py文件里)做类似的事情,但我遇到了这样的错误:

在扫描字符串字面量时遇到行尾(views.py,第21行)

当我把所有内容放在一行时,这个错误就消失了。

有人能展示一下上面的PHP脚本在Python中是怎么写的吗?这样我可以用它作为模板来修复我的视图。

[编辑]

我的Python代码大概是这样的:

def just_frigging_doit(request):
    html = '<html>
                <head><title>What the funk<title></head>
                <body>'

    # try to start builing dynamic HTML from this point onward...
    # but server barfs even further up, on the html var declaration line.

[编辑2]

我按照Ned和S.Lott的建议添加了三重引号,这在我想打印静态文本时效果很好。但如果我想创建动态HTML(比如行号),我就会遇到一个异常——不能将'str'和'int'对象连接在一起。

2 个回答

1
  1. 在Python中,如果你使用三重引号,字符串可以跨越多行:

    """
    This is a 
    multiline
    string
    """
    
  2. 你可能想用Django模板来创建你的HTML页面。可以看看Django的教程,了解怎么做。

  3. Python是强类型的,这意味着它不会像PHP那样自动转换数据类型来让你的表达式正常工作。所以你不能像这样把字符串和数字拼接在一起:"hello" + num

4

我正在尝试动态生成我的HTML,这意味着需要进行很多字符串处理。

别这么做。

  1. 使用Django的模板。它们真的很好用。如果你不知道怎么用,建议你这样做:提问时展示你想做的事情。不要问怎么制作动态HTML,而是问如何创建你想要的页面功能。大约80%的情况下,简单的 {%if%}{%for%} 就能解决你需要的所有问题。剩下的时间,你需要了解一下过滤器和内置标签是怎么工作的。

  2. 如果你非得使用“动态”HTML,可以用 string.Templatehttp://docs.python.org/library/string.html#template-strings 一旦你试过这个,你会发现Django的模板更好。

不要通过字符串处理来创建HTML。


不能将'str'和'int'对象连接在一起。

没错,你不能。

你有三种选择。

  1. 把整数转换成字符串。使用 str() 函数。这种方法不太好,因为你会有很多临时的转换,感觉很麻烦。

  2. 使用字符串的 format() 方法来插入值。这比复杂的字符串处理稍微好一点。做一段时间后,你会明白为什么模板是个好主意。

  3. 使用模板。你可以试试 string.Template。过一段时间后,你会发现Django的模板是个好主意。


my_template.html

<html><head><title>Getting worked up over Python indentations</title></head><body>
<table><tbody>
{%for object in objects%}
    <tr class="{%cycle 'even' 'odd'%}"><td>Row: {{object}}</td></tr>
{%endfor%}
</tbody></table></body></html>

views.py

def myview( request ):
    render_to_response( 'my_template.html',
         { 'objects':range(10) }
    )

我想这就是你制作一个模型所需要的全部。

撰写回答