繼續上節,現在要增加顯示所以影片列表的功能。
(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>

再次測試,發現滿足預想效果 :-)