2011-04-07 88 views
0

假設我有一個名爲app的Django應用程序。在它內部,我有一個在models.py命名數據中定義的模型類。另外,我在模板目錄中有一個html文件,它有幾個選擇列表,應該填充模型的字段,例如類型,日期。 我需要做的是獲取views.py中的字段列表,並使用它們填充選擇列表。另一件事是,在用戶通過在選取列表中選擇一個值來提交他們的查詢之後,我將向他們展示一個表格,顯示模型中所有字段的值。所以基本上我必須檢索用戶輸入的內容,並根據輸入進行查詢,並根據查詢獲取模型中所有字段的數據。我們可以命名另外兩個領域的時間,價值。這些東西應該主要在views.py中完成。如何從模型中獲取字段數據?

這裏是在HMTL文件中的選項列表:

<form action="" method="post"> 
<select name="type" values="type_data"></select> 
<select name="date" values="date_data"></select> 
<input type="submit" value="Submit"> 
</form> 

我試了一下,兩個東西,有:

1.To獲取數據來填充料單,我用:

objects= data.objects.all() 
type_data=getattr(objects, 'type') 
date_data=getattr(objects, 'date') 

2.To獲得數據的查詢後,我用:

if request.method == 'POST': 
    … 
    mytype = '% r' % request.POST.get['type'] 
    mydate = ' %r ' % request.POST.get['date'] 
    objects2= data.objects2.filter(type=mytype,date=mydate) 
    time=getattr(objects2, 'time') 
    value=getattr(objects2, 'value') 

它不起作用。我參考這個鏈接django object get/set field,所以我基本上使用它來獲取模型的現場數據:getattr(obj, 'field_name')

有什麼想法?我感謝任何幫助

回答

1

看看Django's Form功能 - 特別是ModelChoiceField - 它解決了這個問題。

如果你想反思一個模型,看看它有什麼字段,看看model._meta.fields

例如,下面的代碼打印出每個字段的值在模型實例instance

for field in instance._meta.fields: 
    print field.attname, '=', getattr(model, field.attname) 
+0

我試過這些代碼,但它沒有工作。它似乎並不認爲這_meta.fields的東西 – widget 2011-04-08 01:52:01

+0

它總是爲我工作...... – 2012-10-04 16:57:56

1

objects變量是一個QuerySet,物化當是一個「對象列表」,因此要獲得對象屬性的列表,你應該在它們之間迭代:

objects = data.objects.all() 

type_data = [] 
date_date = [] 

for obj in objects: 
    type_data.append(obj.type) 
    date_date.append(obj.date) 

但我想你會真正需要的下拉是讓每個id值(但我可能是錯的):

for obj in objects: 
    type_data.append((obj.pk, obj.type)) 
    date_date.append((obj.pk, obj.date)) 

這將創建一個元組列表:

[(1, 'value1'), (2, 'value2')...] 

所以在模板中,你可以使用:

<select name="type"> 
    {% for value, name in type_data %} 
     <option value="{{ value }}">{{ name }}</option> 
    {% endfor %} 
</select> 

,但有一點,這使Django能夠簡化這一過程 - 瞭解形式。

+0

我正確的,我應該迭代他們來獲得對象的屬性。關於id,我現在實際上並不需要它,我只需要顯示用戶選擇和查詢的值。現在我得到一個錯誤:'instancemethod'對象是不可取代的。我在想,如果這是訪問模型中對象的正確方法。簡單地使用:objects = data.objects.all() 它是否真的爲我獲取物體? – widget 2011-04-07 15:48:05

+0

如果'data'是你的班級... – Jerzyk 2011-04-07 21:17:08

+0

我在我的數據庫中的表名中犯了一個錯誤。它應該是appl_class,而我只有類作爲名稱。有人指出這對我來說。 – widget 2011-04-08 01:51:11