developer tip

Django-간단한 사용자 정의 템플릿 태그 예제

copycodes 2021. 1. 7. 08:08
반응형

Django-간단한 사용자 정의 템플릿 태그 예제


내가 가진 사용자 , 비디오 , 주제 , CRITERIAS등급

  • 비디오주제를
  • 항목CRITERIAS을
  • 사용자는 만들 수 있습니다 비디오 주어진에 대한 주제를
  • 사용자는 속도 수 비디오를 각각 CRITERIAS 당해 주어진 주제 .

내 원본 게시물 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, 나는 나열하고 싶습니다 CRITERIAS비디오를 , 각각에 대한 기준을 현재의 표시 등급 값 형식에게 사용자 .

<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만 더 나은 방법이 있다고 확신합니다. 사실, 여전히 내 모델의 정확성 에 대해 확신하지 못합니다 .

마지막으로 {# The rating value #}현재 치명타 (루프에서)에 대한 비율의 등급 값 으로 바꾸고 싶습니다 . 어떻게 할 수 있습니까?


다음은 내 솔루션입니다 ( 사용자 정의 태그 기반 ).

먼저 파일 구조를 만듭니다. 태그가 필요한 앱 디렉터리로 이동하고 다음 파일을 추가합니다.

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>

태그의 인라인 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.

See also:

ReferenceURL : https://stackoverflow.com/questions/6451304/django-simple-custom-template-tag-example

반응형