继续上节,现在要增加显示所以影片列表的功能。
(ps:稍微修改了一下一开始定义的数据库字段)
# coding=utf8
from  django.db  import  models

#  演员
class  Actor(models.Model):
    name 
=  models.CharField( ' 姓名 ' , max_length = 50 )
    birthday 
=  models.DateField( ' 生日 ' )
    
def   __unicode__ (self):
        
return  self.name

#  发行商
class  Publisher(models.Model):
    name 
=  models.CharField( ' 发行商 ' , max_length = 30 )
    
def   __unicode__ (self):
        
return  self.name

#  影片
class  Film(models.Model):
    title 
=  models.CharField( ' 片名 ' , max_length = 100 )
    actors 
=  models.ManyToManyField(Actor, verbose_name = ' 演员 ' )
    pub_date 
=  models.DateField( ' 发行日期 ' )
    publisher 
=  models.ForeignKey(Publisher, verbose_name = ' 发行商 ' )
    intro 
=  models.TextField( ' 介绍 ' , null = True)
    
def   __unicode__ (self):
        
return  self.title

from  django.contrib  import  admin
admin.site.register((Actor, Publisher, Film))
对models的修改需要手动使用SQL语句修改对应的数据库表。。。。

言归正传,下面为film增加显示所有影片功能。
1、首先,设定url,在urls.py中增加如下内容:
from  mysite.film.models  import  Film
info_dict 
=  {
     ' queryset ' : Film.objects.all(),
}
urlpatterns 
=  patterns( '' ,
    (r
' ^film/list/$ ' ' django.views.generic.list_detail.object_list ' , info_dict),
)
使用的是Django自带的object_list功能,专门用于显示对象列表,使用时,只需要提供一个对象的集合即可,也就是上面的info_dict,而info_dict又是一个queryset,Film.object.all()会转化成SQL语句的select * from film_film,并返回结果,然后赋给queryset。

2、现在该是使用模板的时候了。在settiings里面设置模板存放路径
TEMPLATE_DIRS  =  (
    
' ./templates ' ,
)

3、在mysite下创建templates目录,然后在templates下创建film目录,在film下创建模板,名为film_list.html。该模板的命名方式必须为model_name_list.html,model_name就是要显示的model的名字。
< h1  id ="title">影片列表 </ h1 >
< hr >

< table  border ="1" >
< tr >
  
< th > 片名 </ th >
  
< th > 演员 </ th >
  
< th > 发行商 </ th >
  
< th > 发行日期 </ th >
  
< th > 简介 </ th >
</ tr >
{% for film in object_list %}
< tr >
  
< td > {{ film.title }} </ td >
  
< td > {{ film.actors }} </ td >
  
< td > {{ film.publisher }} </ td >
  
< td > {{ film.pub_date }} </ td >
  
< td > {{ film.intro }} </ td >
</ tr >
{% endfor %}
</ table >

可以看出,Django里面的模板其实也是html,只不过增加了Django自定义的标签而已。两个大括号中间的是变量,大括号加百分号中间的是Django模板标签。详细语法可参考 http://docs.djangoproject.com/en/dev/topics/templates

4、进入 http://127.0.0.1:8000/film/list/查看效果。若出现UnicodeDecodeError,说明模板编码不正确,使用EditPlus或UltraEdit将film_list.html另存为utf8编码格式。

5、测试后发现,“演员”这一列中显示的是<django.db.models.fields.related.ManyRelatedManager object at 0x01791B30> 等等一堆不知所谓的内容。原因是模板中的{{film.actors}}是一个ManyToMany类型的域,是由多个actor对象组成,因此,将模板修改如下:
< h1  id ="title" > 影片列表 </ h1 >
< hr >

< table  border ="1" >
< tr >
  
< th > 片名 </ th >
  
< th > 演员 </ th >
  
< th > 发行商 </ th >
  
< th > 发行日期 </ th >
  
< th > 简介 </ th >
</ tr >
{% for film in object_list %}
< tr >
  
< td > {{ film.title }} </ td >
  
< td >
  {% for actor in film.actors.all %}
  {{ actor }}
< br >
  {% endfor %}
  
</ td >
  
< td > {{ film.publisher }} </ td >
  
< td > {{ film.pub_date }} </ td >
  
< td > {{ film.intro }} </ td >
</ tr >
{% endfor %}
</ table >

再次测试,发现满足预想效果 :-)