继续上节,现在要增加显示所以影片列表的功能。
(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>
再次测试,发现满足预想效果 :-)