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 %}
<!DOCTYPE html>
<html>
 <body>
    <div class="widget widget-recent-posts">
      <h3 class="widget-title">最新文章</h3>
      {% get_recent_posts as recent_post_list %}
      <ul>
        {% for post in recent_post_list %}
        <li>
          <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
        </li>
        {% empty %}
        暂无文章!
        {% endfor %}
      </ul>
    </div>
 <body>
</html>

五、使用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 %}
  <ul ><u>{{ d_model }}</u>
      {% for d_field in d_fields_list %}
        {% if d_field in choiced_fields|fields_flag:d_model %}
          <li> <input id="{{ d_model}}{{ d_field}}" name={{ d_model }} value={{ d_field }} type="checkbox" checked> <label for="{{ d_model}}{{ d_field}}">{{ d_field }}</label><br></li>
        {% else %}
          <li> <input id="{{ d_model}}{{ d_field}}" name={{ d_model }} value={{ d_field }} type="checkbox" > <label for="{{ d_model}}{{ d_field}}">{{ d_field }}</label><br></li>
        {% endif %}
      {% endfor %}
  </ul>
{% endfor %}

templates/base.html

{% load ralph_tags%}
<!DOCTYPE html>
<html>
 <body>
    <div class="widget widget-recent-posts">
      <h3 class="widget-title">最新文章</h3>
      {% get_recent_posts as recent_post_list %}
      <ul>
        {% for post in recent_post_list %}
        <li>
          <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
        </li>
        {% empty %}
        暂无文章!
        {% endfor %}
      </ul>
      <div> {{display_fields}} <div>
    </div>
 <body>
</html>

猜你喜欢

转载自blog.csdn.net/bocai_xiaodaidai/article/details/87879491