我有用户,视频,主题,标准和评级 < / 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 #}
替换为当前暴击(在循环中)的评级值。我怎么能这样做?
答案 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
中的。
另见: