Django模型中的字段有個choices屬性,這個屬性可以提供被選數據。如果一個字段設置了這個屬性,在模版中如果我要顯示這個字段,那么django模版系統就會將它默認解析為一個下來菜單,這樣對於一個靜態的下拉菜單式很方便的,下來我們看下django官方文檔中對這個屬性使用的介紹。
我們這兒有個例子,我們先定義一個模型,名字為Person ,這個Person 包含了名字和性別兩個字段,代碼如下:
1
2
3
4
5
6
7
8
|
from
django.db
import
models
class
Person(models.Model):
GENDER_CHOICES
=
(
(u
'M'
, u
'Male'
),
(u
'F'
, u
'Female'
),
)
name
=
models.CharField(max_length
=
60
)
gender
=
models.CharField(max_length
=
2
, choices
=
GENDER_CHOICES)
|
接下來我們看下在程序中如何取到帶choices屬性的gender字段的值。
1
2
3
4
5
6
|
>>> p
=
Person(name
=
"Fred Flinstone"
, gender
=
"M"
)
>>> p.save()
>>> p.gender
u
'M'
>>> p.get_gender_display()
u
'Male'
|
可見gender字段中保存了兩個信息,一個為value,一個display_name,我要取value時直接用p.gender即可,如果要取
display_name時用p.get_gender_display()這個函數即可。
接下來看看這個Person如何在界面上顯示呢?首先需要定義一個繼承自模型Person的Form,代碼如下:
1
2
3
4
5
6
|
from
django
import
forms
class
PersonForm(forms.ModelForm):
class
Meta:
model
=
Person
#實例化一個PersonForm然后傳給模版
pf
=
PersonForm()
|
此時在模版中用{{pf.gender}}即可顯示一個下拉菜單,的確方便了開發。如果我想在界面上顯示display_name,直接使用{{p.get_gender_display}}就不行,可是在實際的開發中的確有這樣的需求,此時我們就想到了自定義過濾器,代碼如下:
1
2
3
|
@register
.
filter
(name
=
'displayName'
)
def
displayName(value, arg):
return
apply
(
eval
(
'value.get_'
+
arg
+
'_display'
), ())
|
這樣我們用{{p|displayName:'gender'}}即可顯示出display_name了。這個需求常出現在人員列表的場景中。
原文地址http://quke.org/post/django-model-choices.html