2012-01-07 43 views
2

這是假設是包含字符串的列表,每個字符串代表對象的變量之一。在Django中,如何使用列表項的String值來獲取對象的變量值?

<tbody> 
    {% for o in objects %} 
    <tr> 
     {% for col in columns %} 
     <td>{{ o.col }}</td> 
     {% endfor %} 
    </tr> 
    {% endfor %} 
</tbody> 

例子:

class Dog(models.Model): 
    name = models.CharField() 
    age = models.IntegerField() 
    is_dead = models.BooleanField() 

columns = ('name', 'age') 

我不能明確地輸入對象的變量名,而且必須把它當作另一份名單,因爲我想做一個「通用」的模板。而且,並非所有變量都必須顯示給用戶。

+0

您是否嘗試在視圖中用(無參數)lambda表達式替換字符串? – Marcin 2012-01-07 10:12:35

回答

1

我對django不夠熟悉,不知道是否有內置的東西,但是......您可以將getattr的版本定義爲template filter。出於某種原因(我假設是因爲它是內置函數),我無法簡單地將內建函數註冊爲新的模板過濾器。無論哪種方式,這是怎麼了,我定義我的版本:

# This is defined in myapp/templatetags/dog_extras.py 
from django import template 

register = template.Library() 

@register.filter 
def my_getattr(obj, var): 
    return getattr(obj, var) 

要使用它,你會使用它,就像任何其他兩種ARG模板過濾器:

{{ o|my_getattr:col }} 

這裏有一個完整的例子(不要忘了頂部的「加載」指令!):

{% load dog_extras %} 

<table> 
    <tbody> 
     {% for o in objects %} 
     <tr> 
      {% for col in columns %} 
      <td>{{ o|my_getattr:col }}</td> 
      {% endfor %} 
     </tr> 
     {% endfor %} 
    </tbody> 
</table> 

如果你從來沒用過的自定義模板過濾器,一定要read the docs!

相關問題