Django - 简单的自定义模板标签示例

Pie*_*NAY 56 django django-templates django-models

我有用户,视频,主题,标准评级

  • 一个视频有一个话题
  • 一个主题标准
  • 一个用户可以创建一个视频对于一个给定话题
  • 一个用户可以评价一个视频上的每个指标分析的关注给定的主题.

你可以看到我的原始帖子Django - 评级模型示例DetailView模板,以获得所用模型的详细信息

我已经扩展了DetailView基于视频模型的模板,将给定用户的所选视频评级列表作为额外的上下文.

class VideoFileDetailView(DetailView):
  model = VideoFile

  def get_context_data(self, **kwargs):
    context = super(VideoFileDetailView, self).get_context_data(**kwargs)
    context['rates'] = VideoRate.objects.filter(video=self.object, user=self.request.user)
    return context
Run Code Online (Sandbox Code Playgroud)

在被指向的模板DetailView,我想列出指标分析中的视频,并为每个标准显示当前评级值形成用户.

<div id="rating">
  <ul>
{% for crit in videofile.topic.crits.all %}
    <li>
  {% for rate in rates %}
    {% if rate.crit.id == crit.id %}
      {{ rate.rate }}
    {% endif %}
  {% endfor %}
      <div class="rateit"
        data-rateit-value="{# The rating value #}"
        data-rateit-ispreset="true"
        crit-id="{{ crit.id }}"></div>
      {{ crit }}
    </li>
{% endfor %}
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

(rateit是一个jquery插件,我用来绘制漂亮的星级评级控件)

实际上我在第二节内得到了我的评分值,for但我确信有更好的方法可以做到这一点.事实上,我仍然不确定我的模型正确性.

最后,我想用{# The rating value #}当前暴击率(在循环中)的评级值替换.我怎样才能做到这一点 ?

Pie*_*NAY 89

这是我的解决方案(基于自定义标签):

首先创建文件结构.进入需要标记的app目录,并添加以下文件:

templatetags
templatetags/__init__.py
templatetags/video_tags.py
Run Code Online (Sandbox Code Playgroud)

templatetags/video_tags.py文件:

from django import template

register = template.Library()

@register.simple_tag
def get_rate(crit, rates):
    return rates.get(crit=crit).rate
Run Code Online (Sandbox Code Playgroud)

模板部分,带有我们的标签调用:

{% load video_tags %}

<div id="rating">
  <ul>
{% for crit in videofile.topic.crits.all %}
    <li>
      <div class="rateit"
        data-rateit-value="{% get_rate crit rates %}"
        data-rateit-ispreset="true"
        crit-id="{{ crit.id }}"></div>
      {{ crit }}
    </li>
{% endfor %}
  </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 另外.."在模板中使用标签或过滤器之前,您需要重新启动服务器." [来自文档](https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/) (31认同)
  • 你不应该导入video_tags吗?{%load video_tags%} (11认同)
  • “ custom_tags”不是注册的标签库。必须是以下之一:admin_list ...等等 (2认同)

Cir*_*四事件 14

标记中的内联HTML

如果HTML很小,则此方法比创建单独的文件更方便.

此示例将指向用户配置文件的链接.该文件templatetags/somemodule.py包含:

from django import template
from django.template import Template

register = template.Library()

@register.simple_tag(takes_context=True)
def user_link(context):
    return Template('<a href="{% url \'user_detail\' ' +
            'user.id %}">{{ user.username }}</a>').render(context)
Run Code Online (Sandbox Code Playgroud)

Template#render已经返回一个非XSS转义的安全字符串.例如,如果我们只做了:

return '<br>'
Run Code Online (Sandbox Code Playgroud)

它会被逃脱.你可能也想玩mark_safe.

您可以在以下所有视图中使用该标记:

TEMPLATES = [
    {
        'OPTIONS': {
            'builtins': [
                'myprojectname.templatetags.somemodule',
Run Code Online (Sandbox Code Playgroud)

settings.py.

也可以看看: