Подтвердить что ты не робот

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 #} на значение рейтинга из ставки для текущего крита (в цикле). Как я могу это сделать?

4b9b3361

Ответ 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.

См. также: