Django用templatetags处理列表动态数据

Posted by Danfi on 2011-01-20 添加评论

以django例子里最常见的Books和Author为例,假设有Book和Author两张表。
models.py

  1. ...
  2. class Author(models.Model):
  3.        name = models.CharField(_('Author Name'),max_length=128)
  4.       
  5.        def __unicode__(self):
  6.              return self.name
  7.               
  8. class Books(models.Model):
  9.        title = models.CharField(_('Books'),max_length=128)
  10.        author = models.Foreignkey(Author, related_name='book_author')
  11.       
  12.        def __unicode__(self):
  13.              return self.title
  14. ...

如上述代码所示,假设每本书有一个作者,且名字唯一,然后我们对作者进行列表处理。
views.py

  1. ...
  2. def authorList(request):
  3.     lists= Author.objects.all()
  4.     return render_to_response('index.html',{'lists':lists})
  5. ...

然后我们首先在app下新建templatetags文件夹,并添加__init__.py至其内,新建count.py来统计作者所出版的书本

数量。
count.py

  1. from django.template import Library, Node,Variable
  2. from models import *
  3. register = Library()
  4.  
  5. class GetNumbers(Node):
  6.     def __init__(self, name):
  7.         self.name= name
  8.         
  9.     def render(self, context):
  10.         name= Variable(self.name).resolve(context)
  11.         allBooks = Books.objects.filter(author=name)
  12.         return str(len(allBooks))
  13.  
  14. @register.tag(name="getnumbers")   
  15. def get_numbers(parser, token):
  16.     bits = token.contents.split()
  17.     return GetNumbers(bits[1])

然后在template里用{% count %}来引用count.py下的函数,再用{% getnumbers author.name %},

把姓名传入该函数,进行比较统计出书本的数量。
index.html

  1. {% count %}
  2. ...
  3. <table>
  4. <tr><td>{% trans 'Author Name' %}</td><td>{% trans 'The Number Of Books' %}<td></tr>
  5. {% for author in lists %}
  6. <td>{{ author .name }}</td><td>{% getnumbers author.name %}</td>
  7. {% endfor %}
  8. </table>
  9. ...


发表评论

(必填,但不会被公开)