Django - 简单的自定义模板标签示例 [英] Django - Simple custom template tag example
问题描述
/ p>
- A 视频有一个主题
- 对于给定的主题
- 可以对每个标准
您可以看到我的原始帖子 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)
返回上下文
在 DetailView
,我想列出视频的标准,对于每个标准 em>显示用户中的当前评分值。
; div id =rating>
< ul>
{%for videofile.topic.crits.all%}
< li>
{%率率%}
{%if rate.crit.id == crit.id%}
{{rate.rate}}
{%endif%
{%endfor%}
< div class =rateit
data-rateit-value ={#评级值#}
data-rateit-ispreset =true
crit-id ={{crit.id}}>< / div>
{{crit}}
< / li>
{%endfor%}
< / ul>
< / div>
( rateit 是一个jquery插件,我用来绘制漂亮的星级评分控件)
其实我得到我的评分值这里是第二个为
,但我确定有一个更好的方法来做到这一点。事实上,我仍然不能确定我的模型的正确性。 p>
最后,我想用当前暴击的评级值替换 {#评级值#}
(在循环)。
这是我的解决方案(基于自定义标签):
首先创建文件结构。进入需要标签的应用程序目录,并添加以下文件:
templatetags
templatetags / __ init__.py
templatetags / video_tags.py
templatetags / video_tags.py 文件:
从django导入模板
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 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>
I have users, videos, topics, criterias and ratings
- A video has a topic
- A topic has criterias
- A user can create a video for a given topic
- A user can rate a video on each criterias given for the concerned topic.
You can see my original post Django - Rating Model Example DetailView Template to get details on the model used
I have extended a DetailView
template based on the video model to put the list of ratings for the selected video for a given user as extra context.
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
In the template pointed by the DetailView
, I'd like to list the criterias of the video, and for each criteria display the current rating value form the user.
<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 is a jquery plugin that I use to draw pretty stars rating controls)
Actually I get my rating values here within the 2nd for
but I'm sure there is a better way to do that. In fact, I'm still not sure about my model correctness.
Finally I'd like to replace {# The rating value #}
by the rating value from rate for the current crit (in the loop). How can I do that ?
Here is my solution (based on a custom tag):
Firstly create the file structure. Go into the app directory where the tag is needed, and add these files:
templatetags
templatetags/__init__.py
templatetags/video_tags.py
The templatetags/video_tags.py file:
from django import template
register = template.Library()
@register.simple_tag
def get_rate(crit, rates):
return rates.get(crit=crit).rate
The template part, with our tag call:
{% 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>
这篇关于Django - 简单的自定义模板标签示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!