수색…


변수

뷰 컨텍스트에서 제공 한 변수는 이중 중괄호 표기법을 사용하여 액세스 할 수 있습니다.

귀하의 views.py :

class UserView(TemplateView):
  """ Supply the request user object to the template """

  template_name = "user.html"

  def get_context_data(self, **kwargs):
    context = super(UserView, self).get_context_data(**kwargs)
    context.update(user=self.request.user)
    return context

user.html :

<h1>{{ user.username }}</h1>

<div class="email">{{ user.email }}</div>

점 표기법은 다음을 액세스합니다.

  • 예를 들어 user.username{{ user.username }} 이 될 것입니다.
  • 사전 검색, 예. request.GET["search"] {{ request.GET.search }}
  • 인수가없는 메소드 users.count() 예 : users.count(){{ user.count }}

템플릿 변수는 인수를 취하는 메소드에 액세스 할 수 없습니다.

또한 변수를 테스트하고 반복 할 수 있습니다.

{% if user.is_authenticated %}
  {% for item in menu %}
    <li><a href="{{ item.url }}">{{ item.name }}</a></li>
  {% endfor %}
{% else %}
  <li><a href="{% url 'login' %}">Login</a>
{% endif %}

URL은 {% url 'name' %} 형식을 사용하여 액세스합니다. 여기서 이름은 urls.py 의 이름과 일치합니다.

{% url 'login' %} - 아마 /accounts/login/ 로 렌더링됩니다.
{% url 'user_profile' user.id %} - URL 인수는 순서대로 제공됩니다
{% url next %} - URL은 변수가 될 수 있습니다.

클래스 기반 뷰의 템플릿

맞춤 변수로 템플릿에 데이터를 전달할 수 있습니다.

귀하의 views.py :

from django.views.generic import TemplateView
from MyProject.myapp.models import Item

class ItemView(TemplateView):
    template_name = "item.html"

    def items(self):
        """ Get all Items """
        return Item.objects.all()

    def certain_items(self):
        """ Get certain Items """
        return Item.objects.filter(model_field="certain")
    
    def categories(self):
        """ Get categories related to this Item """
        return Item.objects.get(slug=self.kwargs['slug']).categories.all()

item.html 의 간단한 목록 :

{% for item in view.items %}
<ul>        
    <li>{{ item }}</li>
</ul>
{% endfor %}

데이터의 추가 속성을 검색 할 수도 있습니다.

모델 Itemname 필드가 있다고 가정합니다.

{% for item in view.certain_items %}
<ul>        
    <li>{{ item.name }}</li>
</ul>
{% endfor %}

함수 기반 뷰의 템플릿

다음과 같이 함수 기반 뷰에서 템플릿을 사용할 수 있습니다.

from django.shortcuts import render

def view(request):
    return render(request, "template.html")

템플릿 변수를 사용하려면 다음과 같이하면됩니다.

from django.shortcuts import render

def view(request):
    context = {"var1": True, "var2": "foo"}
    return render(request, "template.html", context=context)

그런 다음 template.html 에서 다음과 같이 변수를 참조 할 수 있습니다.

<html>
{% if var1 %}
    <h1>{{ var2 }}</h1>
{% endif %}
</html>

템플릿 필터

Django 템플릿 시스템에는 내장 된 태그필터가 있습니다 .이 태그필터 는 내용을 특정 방식으로 렌더링하는 템플릿 내부의 함수입니다. 파이프로 여러 필터를 지정할 수 있으며 변수 구문과 마찬가지로 필터에 인수가있을 수 있습니다.

{{ "MAINROAD 3222"|lower }}    # mainroad 3222
{{ 10|add:15}}                 # 25
{{ "super"|add:"glue" }}       # superglue
{{ "A7"|add:"00" }}            # A700
{{ myDate | date:"D d M Y"}}   # Wed 20 Jul 2016   

사용할 수있는 내장 필터 목록은 https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ref-templates-builtins-filters 에서 확인할 수 있습니다.

사용자 정의 필터 만들기

자신의 템플릿 필터를 추가하려면 app 폴더 내에 templatetags 라는 폴더를 만듭니다. 그런 다음 필터를 포함 할 파일을 __init__.py 및 파일에 추가하십시오.

#/myapp/templatetags/filters.py
from django import template

register = template.Library()

@register.filter(name='tostring')
def to_string(value):
    return str(value)

실제로 필터를 사용하려면 템플릿에로드해야합니다.

#templates/mytemplate.html
{% load filters %}
{% if customer_id|tostring = customer %} Welcome back {% endif%}

속임수

필터가 처음에는 단순 해 보일지라도, 다음과 같은 멋진 일을 할 수 있습니다.

{% for x in ""|ljust:"20" %}Hello World!{% endfor %}    # Hello World!Hello World!Hel...    
{{ user.name.split|join:"_" }} ## replaces whitespace with '_' 

자세한 내용은 템플릿 태그 를 참조하십시오.

민감한 메소드가 템플릿에서 호출되지 않도록 방지

객체가 템플릿 컨텍스트에 노출되면 인수없는 메소드를 사용할 수 있습니다. 이 함수가 "게터"일 때 유용합니다. 그러나 이러한 방법으로 일부 데이터가 변경되거나 부작용이 발생할 경우 위험 할 수 있습니다. 템플릿 작성자를 신뢰할 가능성이 있지만 함수의 부작용을 인식하지 못하거나 실수로 잘못된 속성을 호출한다고 생각할 수도 있습니다.

주어진 다음 모델 :

class Foobar(models.Model):
    points_credit = models.IntegerField()

    def credit_points(self, nb_points=1):
        """Credit points and return the new points credit value."""
        self.points_credit = F('points_credit') + nb_points
        self.save(update_fields=['points_credit'])
        return self.points_credit

실수로 템플릿에 다음과 같이 씁니다.

 You have {{ foobar.credit_points }} points!

이것은 템플릿이 호출 될 때마다 포인트 수를 증가시킵니다. 그리고 당신도 그것을 알아 채지 못할 수도 있습니다.

이를 방지하려면 부작용이있는 메소드에 대해 alters_data 속성을 True 로 설정해야합니다. 이렇게하면 템플리트에서 호출 할 수 없게됩니다.

def credit_points(self, nb_points=1):
    """Credit points and return the new points credit value."""
    self.points_credit = F('points_credit') + nb_points
    self.save(update_fields=['points_credit'])
    return self.points_credit
credit_points.alters_data = True

{% extend %}, {% include %} 및 {% blocks %}의 사용

개요

  • {% extends %} : 인수로 주어진 템플릿을 현재 템플릿의 부모로 선언합니다. 사용법 : {% extends 'parent_template.html' %} .

  • {% block %} {% endblock %} : 템플릿의 섹션을 정의하는 데 사용되므로 다른 템플릿이이 템플릿을 확장하면 내부에 작성된 모든 HTML 코드를 대체 할 수 있습니다. 블록은 이름으로 식별됩니다. 사용법 : {% block content %} <html_code> {% endblock %} .

  • {% include %} : 현재 템플릿에 템플릿을 삽입합니다. 포함 된 템플릿은 요청의 컨텍스트를 수신하므로 맞춤 변수도 지정할 수 있습니다. 기본 사용법 : {% include 'template_name.html' %} , 변수 사용 : {% include 'template_name.html' with variable='value' variable2=8 %}

안내서

모든 코드에 공통된 레이아웃을 사용하여 프런트 엔드 사이드 코드를 작성 중이며 모든 템플릿에 대해 코드를 반복하지 않으려한다고 가정 해보십시오. Django는 그렇게하기위한 빌드 된 태그를 제공합니다.
동일한 레이아웃을 공유하는 3 개의 템플릿이있는 하나의 블로그 웹 사이트가 있다고 가정 해 보겠습니다.

project_directory
    ..
    templates
      front-page.html
      blogs.html
      blog-detail.html

1) base.html 파일을 정의하고,

<html>
  <head>
  </head>

  <body>
        {% block content %}
        {% endblock %}
   </body>
</html>

2) blog.html 에서 확장하십시오.

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
{% endblock %}

# None of the code written here will be added to the template

여기에서는 기본 레이아웃을 확장하여 HTML 레이아웃을 blog.html 파일에서 사용할 수있게되었습니다. { % block %} 개념은 템플릿 상속으로,이 템플릿을 사용하면 자신의 모든 공통 요소를 포함하는 기본 "골격"템플릿을 만들 수 있습니다 자식 템플릿이 재정의 할 수있는 블록을 정의합니다.

3) 이제도 3 회 한 새 템플릿 생성 기록되는 일부 인기 posts.Instead 정의 동일한 HTML DIV 가진 당신의 3 템플릿의 모든 가정 posts.html .

blog.html

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
    {% include 'posts.html' %} # includes posts.html in blog.html file without passing any data
    <!-- or -->
    {% include 'posts.html' with posts=postdata %} # includes posts.html in blog.html file with passing posts data which is context of view function returns.
{% endblock %}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow