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

时间:2010-10-24 14:51:39

标签: python 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中),我得到的错误如下:

扫描字符串文字时的EOL(views.py,第21行)

当我将所有内容放在一行中时,它就会消除错误。

有人可以展示如何在python中编写上面的小PHP脚本吗?所以我可以用它作为模板来修复我的视图。

[编辑]

我的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.

[EDIT2]

我添加了Ned和S.Lott建议的三重引号,如果我想打印出静态文本,它可以正常工作。如果我想创建动态html(例如行号),我会得到一个异常 - 无法连接'str'和'int'对象。

2 个答案:

答案 0 :(得分:4)

  

我试图动态生成我的html,这意味着很多字符串操作。

不要这样做。

  1. 使用Django的模板。他们的工作非常非常好。如果您无法弄清楚如何应用它们,请执行此操作。问一个问题,说明你想做什么。不要问如何制作动态HTML。询问如何创建您尝试创建的任何页面功能。 80%的情况下,简单的{%if%}{%for%}可以完成您需要的一切。其余的时间你需要知道过滤器和内置标签的工作原理。

  2. 如果您必须回归“动态”HTML,请使用string.Templatehttp://docs.python.org/library/string.html#template-strings一旦你尝试了这个,你会发现Django更好。

  3. 不要进行字符串操作来创建HTML。


      

    无法连接'str'和'int'对象。

    正确。你不能。

    你有三个选择。

    1. 将int转换为字符串。使用str()功能。这不能很好地扩展。你有很多特别的转换和东西。不愉快。

    2. 使用字符串的format()方法将值插入字符串。这比复杂的字符串操作略胜一筹。在这样做了一段时间后,你弄清楚为什么模板是个好主意。

    3. 使用模板。您可以尝试string.Template。过了一会儿,你弄明白为什么Django是个好主意。


    4. <强> 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) }
          )
      

      我认为这就是你需要一个模型。

答案 1 :(得分:1)

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

    """
    This is a 
    multiline
    string
    """
    
  2. 您可能希望使用Django模板来创建HTML。阅读Django教程,了解它是如何完成的。

  3. Python是强类型的,这意味着它不会自动转换类型以使表达式解决,就像PHP一样。所以你不能连接像这样的字符串和数字:"hello" + num