【问题标题】:Django - Simple custom template tag exampleDjango - 简单的自定义模板标签示例
【发布时间】:2011-09-21 00:47:38
【问题描述】:

我有用户视频主题标准评分

  • 一个视频有一个主题
  • 一个主题标准
  • 用户可以为给定的主题创建视频
  • 用户可以根据为相关主题给出的每个标准视频进行评分。

您可以查看我的原始帖子Django - Rating Model Example DetailView Template 以获取有关所用模型的详细信息

我已经扩展了一个基于 video 模型的 DetailView 模板,以放置给定 videoratings 列表user 作为额外的上下文。

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指向的模板中,我想列出videocriterias,以及每个criteria用户显示当前评分值

<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 #}(在循环中)。我该怎么做?

【问题讨论】:

  • 如果你在模型上添加帮助属性来为你做一些事情,你可以简化你的模板代码,例如循环速率。
  • 其实最好是作为模板标签。传入ratescrit,返回rates.filter(crit=crit)

标签: django django-models django-templates


【解决方案1】:

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

首先创建文件结构。进入需要标签的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>

【讨论】:

  • 不应该导入 video_tags 吗? {% 加载 video_tags %}
  • Also.. “您需要重新启动服务器,然后才能在模板中使用标签或过滤器。” from the docs
  • 它仍然没有加载它。完全不知道发生了什么
  • 'custom_tags' 不是已注册的标签库。必须是以下之一:admin_list ...等
【解决方案2】:

标签中的内联 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.

另见:

【讨论】:

  • 谢谢,这解决了我的一个大问题。
猜你喜欢
  • 2021-07-13
  • 2015-01-20
  • 2012-03-15
  • 2013-05-06
  • 2015-12-17
  • 2011-03-31
  • 2011-10-05
  • 1970-01-01
相关资源
最近更新 更多