Django - простой пример тега шаблона
У меня есть пользователи, видео, темы, критерии и рейтинги.
- У видео есть тема
- В теме есть критерии.
- Пользователь может создать видео для данной темы
- Пользователь может оценивать видео по каждому критерию, указанному для соответствующей темы.
Вы можете увидеть мое оригинальное сообщение 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
В шаблоне, отмеченном 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, который я использую для рисования элементов управления рейтингами звезд)
На самом деле, я получаю свои рейтинговые значения здесь в течение 2-го for
, но я уверен, что есть лучший способ сделать это. На самом деле, я все еще не уверен в правильности model.
Наконец, я хотел бы заменить {# The rating value #}
на значение рейтинга из ставки для текущего крита (в цикле). Как я могу это сделать?
Ответы
Ответ 1
Вот мое решение (на основе настраиваемого тега):
Сначала создайте структуру файла. Зайдите в каталог приложения, где требуется тег, и добавьте эти файлы:
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>
Ответ 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
.
См. также: