继续上节,现在要增加显示所以影片列表的功能。
(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>

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