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

时间:2011-06-23 08:31:18

标签: django django-models django-templates

我有用户视频主题标准评级 < / p>

  • 视频主题
  • 主题标准
  • 用户可以为给定的主题创建视频
  • 用户可以为相关主题的每个标准评分视频

您可以查看我的原始帖子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指向的模板中,我想列出视频标准,以及每个条件 em>从用户显示当前评级值

<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 #}替换为当前暴击(在循环中)的评级值。我怎么能这样做?

2 个答案:

答案 0 :(得分:84)

以下是我的解决方案(基于自定义标记):

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

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>

答案 1 :(得分:13)

标记中的内嵌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中的

另见: