对于配置了choices参数的字段,django提供了get_xxx_display方法
话不多说,代码伺候:
urls.py
from django.conf.urls import url
from django.contrib import admin
from student.views import index
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$', index, name='index')
]
views.py
from django.shortcuts import render
# Create your views here.
from student.models import Student
def index(request):
students = Student.objects.all()
return render(request, 'index.html', context={'students': students})
models.py
from django.db import models
# Create your models here.
class Student(models.Model):
SEX_ITEMS = [
(1, '男'),
(2, '女'),
(0, '未知')
]
STATUS_ITEMS = [
(0, '申请'),
(1, '通过'),
(2, '拒绝')
]
name = models.CharField(max_length=128, verbose_name="姓名")
sex = models.IntegerField(choices=SEX_ITEMS, verbose_name="性别")
profession = models.CharField(max_length=128, verbose_name="职业")
email = models.EmailField(verbose_name="Email")
qq = models.CharField(max_length=128, verbose_name="QQ")
phone = models.CharField(max_length=128, verbose_name="电话")
status = models.IntegerField(choices=STATUS_ITEMS, default=0, verbose_name='审核状态')
created_time = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="创建时间")
def __str__(self):
return '<Student: {}>'.format(self.name)
class Meta:
verbose_name = verbose_name_plural = '学员信息'
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<ul>
{% for student in students %}
<li>{{ student.name }} - {{ student.get_status_display }}</li>
# 在models.py文件中可以看出模型中并未定义get_status_display方法,只定义了status字段
{% endfor %}
</ul>
</body>
</html>
原因:对于设置了choice的字段,Django会自动帮我们提供一个方法(注意是方法), 用来获取这个字段对应的要展示的值。
而admin中,展示带有choice属性的字段时,django会自动帮我们调用get_xxx_display(xxx为字段名,如本文的get_status_display)方法,所以不用配置。而在我们自己写的模板中,这需要自己来写。并且为了简化模板的使用,默认只支持无参数的方法调用,你只需要写方法名称即可,后面的括号不能写,Django会自行帮你调用(如果是方法的话)。