繼續上節,現在要增加顯示所以影片列表的功能。
(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/templates4、進入
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>
再次測試,發現滿足預想效果 :-)