以django例子里最常见的Books和Author为例,假设有Book和Author两张表。
models.py
- ...
- class Author(models.Model):
- name = models.CharField(_('Author Name'),max_length=128)
- def __unicode__(self):
- return self.name
- class Books(models.Model):
- title = models.CharField(_('Books'),max_length=128)
- author = models.Foreignkey(Author, related_name='book_author')
- def __unicode__(self):
- return self.title
- ...
如上述代码所示,假设每本书有一个作者,且名字唯一,然后我们对作者进行列表处理。
views.py
- ...
- def authorList(request):
- lists= Author.objects.all()
- return render_to_response('index.html',{'lists':lists})
- ...
然后我们首先在app下新建templatetags文件夹,并添加__init__.py至其内,新建count.py来统计作者所出版的书本
数量。
count.py
- from django.template import Library, Node,Variable
- from models import *
- register = Library()
- class GetNumbers(Node):
- def __init__(self, name):
- self.name= name
- def render(self, context):
- name= Variable(self.name).resolve(context)
- allBooks = Books.objects.filter(author=name)
- return str(len(allBooks))
- @register.tag(name="getnumbers")
- def get_numbers(parser, token):
- bits = token.contents.split()
- return GetNumbers(bits[1])
然后在template里用{% count %}来引用count.py下的函数,再用{% getnumbers author.name %},
把姓名传入该函数,进行比较统计出书本的数量。
index.html
- {% count %}
- ...
- <table>
- <tr><td>{% trans 'Author Name' %}</td><td>{% trans 'The Number Of Books' %}<td></tr>
- {% for author in lists %}
- <td>{{ author .name }}</td><td>{% getnumbers author.name %}</td>
- {% endfor %}
- </table>
- ...