2011-06-23 56 views
41

我有用戶視頻主題指標分析評級Django的 - 簡單的自定義模板標記示例

  • 一個視頻話題
  • 主題標準
  • 一個用戶可以創建一個視頻對於給定話題
  • 一個用戶可以對有關話題給每個指標分析視頻

你可以看到我原來的職位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指向的模板,我想列出審覈規定的視頻,並且對於每個標準顯示當前評級值形式用戶

<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 #}。我怎樣才能做到這一點 ?

+1

有什麼問題嗎? –

+1

如果您在您的模型中添加了助手屬性,可以簡化您的模板代碼,例如循環速率。 –

+1

其實,它可能是最好的模板標籤。傳入'rates'和'crit',返回'rates.filter(暴擊=暴擊)' –

回答

72

這裏是我的解決方案(基於一個自定義標籤):

首先創建的文件結構。進入其中需要標籤的應用程序目錄,並添加這些文件:

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> 
+10

不應該導入video_tags? {%load video_tags%} –

+24

另外..「在使用模板中的標籤或過濾器之前,您需要重新啓動服務器。」 [從文檔](https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/) – Andrew

+0

,它仍然不會加載它。根本不知道發生了什麼 – holms

7

內嵌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

參見: