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

问题描述:

我有用户视频主题指标分析评级Django的 - 简单的自定义模板标记示例

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

你可以看到我原来的职位Django - Rating Model Example DetailView Template得到的模型细节时,使用

我已经扩展基础上,视频模型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 

在通过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> 

rateit是我用来绘制漂亮的星级控制一个jQuery插件)

其实我在这里得到了第二for内我的评价值,但我敢肯定有一个更好的方式来做到那。事实上,我仍然不确定我的model是否正确。

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

+1

有什么问题吗? –

+1

如果您在您的模型中添加了助手属性,可以简化您的模板代码,例如循环速率。 –

+1

其实,它可能是最好的模板标签。传入'rates'和'crit',返回'rates.filter(暴击=暴击)' –

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

首先创建的文件结构。进入其中需要标签的应用程序目录,并添加这些文件:

templatetags 
templatetags/__init__.py 
templatetags/video_tags.py 

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 

模板的一部分,与我们的标签调用:

{% 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> 
+10

不应该导入video_tags? {%load video_tags%} –

+24

另外..“在使用模板中的标签或过滤器之前,您需要重新启动服务器。” [从文档](https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/) – Andrew

+0

,它仍然不会加载它。根本不知道发生了什么 – holms

内嵌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) 

Template#render已经返回一个安全的字符串这是不XSS逃脱。例如。如果我们只是这样做:

return '<br>' 

它会被转义。你可能也想玩mark_safe

您可以与所有的美景可用的标签:

TEMPLATES = [ 
    { 
     'OPTIONS': { 
      'builtins': [ 
       'myprojectname.templatetags.somemodule', 

settings.py

参见: