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 #}
。我怎样才能做到这一点 ?
答
这里是我的解决方案(基于一个自定义标签):
首先创建的文件结构。进入其中需要标签的应用程序目录,并添加这些文件:
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>
答
内嵌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
。
参见:
有什么问题吗? –
如果您在您的模型中添加了助手属性,可以简化您的模板代码,例如循环速率。 –
其实,它可能是最好的模板标签。传入'rates'和'crit',返回'rates.filter(暴击=暴击)' –