Django – 简单的自定义模板标签示例
我有用户 , video , 主题 , 标准和评级
- 一个video有一个话题
- 一个话题有标准
- 用户可以为给定主题创buildvideo
- 用户可以对针对相关主题给出的每个标准评价video 。
您可以看到我的原始文章Django – 评级模型示例DetailView模板获取使用的模型的细节
我已经扩展了一个基于video模型的DetailView
模板,将给定用户所选video的评级列表作为额外的上下文。
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
指向的模板中,我想列出video的标准 ,并为每个标准显示用户的当前评价值 。
<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
但我相信有一个更好的方法来做到这一点。 事实上,我仍然不确定我的模型是否正确。
最后,我想用来自当前暴击率(在循环中) {# The rating value #}
replace{# The rating value #}
。 我怎样才能做到这一点 ?
这是我的解决scheme(基于自定义标签 ):
首先创build文件结构。 进入需要标签的应用程序目录,并添加这些文件:
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>
在标签中embeddedHTML
如果HTML很小,这个方法比创build一个单独的文件更方便。
本示例将用户configuration文件的链接分解出来。 文件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转义的安全string。 例如,如果我们只是做了:
return '<br>'
它会被逃脱。 你可能也想玩mark_safe
。
您可以使用以下标签在所有视图上显示该标签:
TEMPLATES = [ { 'OPTIONS': { 'builtins': [ 'myprojectname.templatetags.somemodule',
在settings.py
。
也可以看看:
- https://docs.djangoproject.com/en/1.9/howto/custom-template-tags/
- 将模板variables呈现为HTML