Django
템플릿
수색…
변수
뷰 컨텍스트에서 제공 한 변수는 이중 중괄호 표기법을 사용하여 액세스 할 수 있습니다.
귀하의 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 %}
데이터의 추가 속성을 검색 할 수도 있습니다.
모델 Item
에 name
필드가 있다고 가정합니다.
{% 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 %}