Django之模型(model)中的choices字段的使用(轉發)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM