2011-08-24 93 views
0

好的..我是Python的noob,但是使用PHP很多。從python中的對象創建表單

基本上我試圖找出如何採取一個對象 - 例如:

{key:value,key:value} 

{key:[value,value,value],key2:value2} 

,並把它們變成形式:

<input name="key" value="value"> 
<input name="key" value="value"> 

<input name="key[]" value="value"> 
<input name="key[]" value="value"> 
<input name="key[]" value="value"> 
<input name="key2" value="value2"> 
+4

當然,我們可以給打印出像那些你想要的字符串代碼。但這不是你應該做的。你爲什麼不使用模板引擎?問題將被簡化爲一個for循環和一些HTML,而這只是一個單一的簡單任務......我看到了手動構建HTML的代碼。我知道我爲什麼宣傳模板引擎。 – delnan

+0

somthing在你的問題中失蹤!你想轉向什麼形式? – Mohammad

+0

你的第一個例子在Python中是不可能的:你不能在同一個鍵上有兩個字典條目(這在PHP中是不可能的,我相信) –

回答

1

您可以用HTML的結構的模板。 然後,您可以將#key#和#value#替換爲實際值。

template = '<input name="#key#" value="#value#">' 
html = template 
data = {key:value,key:value} 
for key in data.keys(): 
    html = html.replace("#key#", key).replace("#value#", data[value]) + "\n" 
    html = html + template 
#there's an extra template line here that you'll have to get rid of. 
html = "\n".join(html.split("\n")[0:-1]) 

東西你的第二個例子相似。

+1

有一對夫婦與此有關的問題。 1:它不起作用,你實際上並沒有在任何地方遍歷字典值,也沒有編寫或產生任何數據。 2:你正在使用'str.replace'而不是'str.format'或'str%(data,)'來沒有明顯的好處。 – SingleNegationElimination

+0

沒錯,你應該使用{字典} .keys()中的鍵值,我會更正的。謝謝。 – martincho

+0

而且我同意字符串格式更優雅。 – martincho

0

有用於處理表單的創建和驗證Python中的大量的選項。如果你正在使用Django,it has form building and validation built-in。如果您正在構建一個獨立的工具,您有WTForms,z3c.form,deform ......這只是簡短的列表。

幾件事情要注意,如果你是從PHP背景的:

  1. Python是不是一個模板語言 - 它是一個通用的語言。 PHP的開發首先是爲了使創建動態網頁變得簡單 - 因此,將PHP嵌入到HTML中非常簡單,並且每天都會調用它。 Python並沒有讓所有的東西在一個文件中一樣簡單(儘管你只能使用多行字符串,連接和.format做一些非常令人印象深刻的事情)。你會想看看一個模板庫 - 看一下Jinja2,Mako,Breve或Chameleon,然後選擇一個看起來最直觀的模型庫。

  2. 如果您打算爲單個名稱返回多個值,則不需要在HTML中使用I_am_an_array[]構造。您使用的任何圖書館(including the built-in one)都支持爲單個名稱接收多個值,並將適當地處理相關事宜。

0

呸,什麼的,格蘭代碼:

import cgi 
FIELD = '<input name="%s%s" value="%s">\n' 
def formulate(ob): 
    def _formulate(): 
     for k, v in ob.iteritems(): 
      if isinstance(v, list): 
       for i in v: 
        yield FIELD % (k, '[]', cgi.escape(i, True)) 
      else: 
       yield FIELD % (k, '', cgi.escape(v, True)) 
    return ''.join(_formulate())