django模板中使用自定义的模板标签

一、模板标签目录结构
首先在我们的 blog 应用下创建一个 templatetags 包。之后在 templatetags\ 目录下创建一个 blog_tags.py 文件,这个文件存放自定义的模板标签代码。

此时你的目录结构应该是这样的:

blog\
    __init__.py
    admin.py
    apps.py
    migrations\
        __init__.py
    models.py
    static\
    templatetags\
        __init__.py
        blog_tags.py
    tests.py
    views.py

二、编写模板标签代码

blog/templatetags/blog_tags.py

from ..models import Post

def get_recent_posts(num=5):
    return Post.objects.all().order_by('-created_time')[:num]

三、注册标签
为了能够通过 {% get_recent_posts %} 的语法在模板中调用这个函数,必须按照 Django 的规定注册这个函数为模板标签,方法如下:

blog/templatetags/blog_tags.py

from django import template
from ..models import Post

register = template.Library()

@register.simple_tag
def get_recent_posts(num=5):
    return Post.objects.all().order_by('-created_time')[:num]

四、使用自定义的模板标签
打开 base.html,导入 blog_tags,并使用:

templates/base.html

{% load blog_tags %}


 
    

最新文章

{% get_recent_posts as recent_post_list %}
    {% for post in recent_post_list %}
  • {{ post.title }}
  • {% empty %} 暂无文章! {% endfor %}

五、使用inclusion_tag模板标签

blog/templatetags/blog_tags.py

 @register.inclusion_tag('admin/templatetags/personal_fields_settings.html', takes_context=True)
def display_fields(context):
    from ralph.accounts.models import Model_Display
    group = context['original']
    queryset = Model_Display.objects.filter(group=group)
    models = queryset.values('model').distinct().order_by('model')
    choiced_fields_dict = {}
    for model in models:
        model_name = model['model']
        fields = []
        for query in queryset:
            if query.model == model_name:
                fields.append(query.field)
        choiced_fields_dict[model_name] = fields
    return {'display_fields': display_fields_dict, 'choiced_fields': choiced_fields_dict}

admin/templatetags/personal_fields_settings.html
{% load ralph_tags %}

{% for d_model, d_fields_list in display_fields.items %}
  
    {{ d_model }} {% for d_field in d_fields_list %} {% if d_field in choiced_fields|fields_flag:d_model %}

  • {% else %}

  • {% endif %} {% endfor %}
{% endfor %}

templates/base.html

{% load ralph_tags%}


 
    

最新文章

{% get_recent_posts as recent_post_list %}
    {% for post in recent_post_list %}
  • {{ post.title }}
  • {% empty %} 暂无文章! {% endfor %}
{{display_fields}}

你可能感兴趣的:(Django)