Pie*_*NAY 56 django django-templates django-models
我有用户,视频,主题,标准和评级
你可以看到我的原始帖子Django - 评级模型示例DetailView模板,以获得所用模型的详细信息
我已经扩展了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
Run Code Online (Sandbox Code Playgroud)
在被指向的模板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>
Run Code Online (Sandbox Code Playgroud)
(rateit是一个jquery插件,我用来绘制漂亮的星级评级控件)
实际上我在第二节内得到了我的评分值,for但我确信有更好的方法可以做到这一点.事实上,我仍然不确定我的模型正确性.
最后,我想用{# The rating value #}当前暴击率(在循环中)的评级值替换.我怎样才能做到这一点 ?
Pie*_*NAY 89
这是我的解决方案(基于自定义标签):
首先创建文件结构.进入需要标记的app目录,并添加以下文件:
templatetags
templatetags/__init__.py
templatetags/video_tags.py
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
模板部分,带有我们的标签调用:
{% 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>
Run Code Online (Sandbox Code Playgroud)
Cir*_*四事件 14
标记中的内联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)
Run Code Online (Sandbox Code Playgroud)
Template#render已经返回一个非XSS转义的安全字符串.例如,如果我们只做了:
return '<br>'
Run Code Online (Sandbox Code Playgroud)
它会被逃脱.你可能也想玩mark_safe.
您可以在以下所有视图中使用该标记:
TEMPLATES = [
{
'OPTIONS': {
'builtins': [
'myprojectname.templatetags.somemodule',
Run Code Online (Sandbox Code Playgroud)
在settings.py.
也可以看看: