根據Django官方文檔:
1 from django.db import models 2 3 class Student(models.Model): 4 FRESHMAN = 'FR' 5 SOPHOMORE = 'SO' 6 JUNIOR = 'JR' 7 SENIOR = 'SR' 8 YEAR_IN_SCHOOL_CHOICES = ( 9 (FRESHMAN, 'Freshman'), 10 (SOPHOMORE, 'Sophomore'), 11 (JUNIOR, 'Junior'), 12 (SENIOR, 'Senior'), 13 ) 14 year_in_school = models.CharField( 15 max_length=2, 16 choices=YEAR_IN_SCHOOL_CHOICES, # choices中傳入YEAR_SCHOOL_CHOICES的元組內容 17 default=FRESHMAN, 18 ) 19 20 def is_upperclass(self): 21 return self.year_in_school in (self.JUNIOR, self.SENIOR)
choices接收一個元組(保證值不可變),每個元組中的第一個元素是要在模型上設置的實際值,第二個元素是人類可讀的名稱。同理每一個選項也是由一個元組(value,display_name)構成。顯而易見,display_name就是要在頁面中展示的。
如何取到value和displayname?
比如說實例一個User對象user,則如示user.sex = value,user.get_sex_display() = display_name,通過屬性取value,通過 get_屬性_display()方法取display_name。
在模板中可以通過模板語言 {{ user.sex }}很簡單地顯示value,但不能直接調用 get_屬性_display()方法(模板畢竟是模板語言)
只能自定義過濾器,順便提一句django中是不能直接調用函數的,可以通過自定義filter來實現(template_filters.py)
1 @register.filter(name='displayName') 2 def displayName(value, arg): 3 return eval('value.get_'+arg+'_display()')
模板中使用{{ user|displayName:'sex'}}
就OK(user是傳入的變量)。