Django模型中字段屬性choice的使用


根據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是傳入的變量)。


免責聲明!

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



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