Django Template

作者:王蒙
标签:Django, Template, Web Framework, Python
简介:介绍 Django 的模板。

目标读者

Python 开发,网站开发

问题

  • 模板继承
  • tags
  • filters
  • context processor
  • Pycharm 对于 Django 模板的支持

解决办法

  • 模板继承

    模板继承,就是通过 {% block {some_name} %}..{% endblock %} 定义 base template。再定义模板时,使用 {% extends “{base template path}”%} 继承 base template。继承模板只能重写 base template 中用 {% block {some_name}%}{% enbblock%} 圈出来的内容, 通过 some_name 连接要替换和被替换的内容。

  • tag: 除了模板继承,其他的 tag 都容易理解,基本只要看到 tag 的名字,就能理解。

    • 如果需要某个特别的功能,可以自定义 tag

      • simple_tag

        from django import template
        register = template.Library()
        from ..models import Post
        
        @register.simple_tag
        def total_posts():
            return Post.published.count()
        
      • inclusion_tag

        @register.inclusion_tag('blog/post/latest_posts.html')
        def show_latest_posts(count=5):
            latest_posts = Post.published.order_by('-publish')[:count]
            return {'latest_posts': latest_posts}
        
      • assignment_tag

        from django.db.models import Count
        @register.assignment_tag
        def get_most_commented_posts(count=5):
            return Post.published.annotate(total_comments=Count('comments')).order_by('-total_comments')[:count]
        
  • filter: filter 就是在模板中对某些量做处理,比如 uppercase 等。filter 几乎看下名字就知道是什么含义。

    • 对于特别的功能,可以自定义 filter

      from django.utils.safestring import mark_safe
      import markdown
      
      @register.filter(name='markdown')
      def markdown_format(text):
          return mark_safe(markdown.markdown(text))
      
  • context processor 从 request 中构造 dict, 这个 dict 可以用在模板中。

    from .cart import Cart
    
    def cart(request):
        return {'cart': Cart(request)}
    

    context processor 要生效,需要写到 settings.py 中。

    TEMPLATES = [
                    {
                    'BACKEND': 'django.template.backends.django.DjangoTemplates',
                    'DIRS': [],
                    'APP_DIRS': True,
                    'OPTIONS': {
                        'context_processors': [
                        'django.template.context_processors.debug',
                        'django.template.context_processors.request',
                        'django.contrib.auth.context_processors.auth',
                        'django.contrib.messages.context_processors.messages',
                        'cart.context_processors.cart',
                    ],
                    },
                    },
                ]
    
  • Pycharm

    实际用 Pycharm 写 template 时,会发现 Pycharm 能够自动补全 tag 和 filter。

参考文献

  • Django By Example