在Django中创建视图(字符串缩进问题)
我刚接触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 个回答
在Python中,如果你使用三重引号,字符串可以跨越多行:
""" This is a multiline string """
你可能想用Django模板来创建你的HTML页面。可以看看Django的教程,了解怎么做。
Python是强类型的,这意味着它不会像PHP那样自动转换数据类型来让你的表达式正常工作。所以你不能像这样把字符串和数字拼接在一起:
"hello" + num
。
我正在尝试动态生成我的HTML,这意味着需要进行很多字符串处理。
别这么做。
使用Django的模板。它们真的很好用。如果你不知道怎么用,建议你这样做:提问时展示你想做的事情。不要问怎么制作动态HTML,而是问如何创建你想要的页面功能。大约80%的情况下,简单的
{%if%}
或{%for%}
就能解决你需要的所有问题。剩下的时间,你需要了解一下过滤器和内置标签是怎么工作的。如果你非得使用“动态”HTML,可以用
string.Template
。http://docs.python.org/library/string.html#template-strings 一旦你试过这个,你会发现Django的模板更好。
不要通过字符串处理来创建HTML。
不能将'str'和'int'对象连接在一起。
没错,你不能。
你有三种选择。
把整数转换成字符串。使用
str()
函数。这种方法不太好,因为你会有很多临时的转换,感觉很麻烦。使用字符串的
format()
方法来插入值。这比复杂的字符串处理稍微好一点。做一段时间后,你会明白为什么模板是个好主意。使用模板。你可以试试
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) }
)
我想这就是你制作一个模型所需要的全部。