29
Django Templates @starwilly

Django Templates

Embed Size (px)

Citation preview

Page 1: Django Templates

Django Templates

@starwilly

Page 2: Django Templates

What We Have Known{{ <post.title> }}

{% if post.photo %}<div class="thumbnail"><img src="{{ post.photo }}" alt="">

</div>{% else %}<div class="thumbnail thumbnail-default"></div>{% endif %}

{% for post in post_list %}…

{% endfor %}

{{ post.created_at|date:"Y / m / d" }}

Variable

Tag <a href="{% url 'post_detail' pk=post.pk %}">

Filter

Page 3: Django Templates

Template Inheritance

home.html post.html

Page 4: Django Templates

Template Inheritance

home.htmlpost.html

Page 5: Django Templates

base.html

home.html

post.html

Page 6: Django Templates

<!-- base.html --><!DOCTYPE html><html><head> <meta charset="utf-8"> <title>A Django Girl's Adventure</title> <link href=“//…/assets/css/style.css” rel="stylesheet"></head><body> <div class="header"> <h1 class="site-title text-center"> <a href="/">A Django Girl’s Adventure</a> </h1> </div> <div class=“container">

{% block content %} {% endblock content %}

</div></body></html>

Page 7: Django Templates

Extends a template

<!-- home.html -->{% extends "base.html" %}

{% block content %}

{% for post in post_list %} <div class="post-wrapper"> <div class="post">

… </div> </div> {% endfor %}

{% endblock content %}

Page 8: Django Templates

Extends a template

{% extends "base.html" %}

{% block content %}

{% for post in post_list %} <div class="post-wrapper"> <div class="post">

… </div> </div> {% endfor %}

{% endblock content %}

{% extends %} must be the first template tag

Page 9: Django Templates

Fill the Block

{% extends "base.html" %}

{% block content %}

{% for post in post_list %} <div class="post-wrapper"> <div class="post">

… </div> </div> {% endfor %}

{% endblock content %}

base.html

Fill content to the block you defined

Page 10: Django Templates

<!-- base.html --><!DOCTYPE html><html><head> <meta charset="utf-8"> <title>A Django Girl's Adventure</title> <link href=“//…/assets/css/style.css” rel="stylesheet"></head><body> <div class=“header">

<h1 class="site-title text-center"> <a href="/">A Django Girl’s Adventure</a> </h1>

<ul class="nav navbar-nav"> <li><a href="#">About Me</a></li> <li><a href="#">Favorite Trips</a></li> <li><a href="#">Albums</a></li> ... <li><a href="#">Contact Me</a></li> </ul>

</div> <div class=“container"> {% block content %} {% endblock content %} </div></body></html>

Include

Page 11: Django Templates

<!-- base.html --><!DOCTYPE html><html><head> <meta charset="utf-8"> <title>A Django Girl's Adventure</title> <link href=“//…/assets/css/style.css” rel="stylesheet"></head><body>

<div class=“header"> <h1 class="site-title text-center"> <a href="/">A Django Girl’s Adventure</a> </h1>

<ul class="nav navbar-nav"> <li><a href="#">About Me</a></li> <li><a href="#">Favorite Trips</a></li> <li><a href="#">Albums</a></li> ... <li><a href="#">Contact Me</a></li> </ul> </div>

<div class=“container"> {% block content %} {% endblock content %} </div></body></html>

Extract as Another Template

Page 12: Django Templates

<!-- base.html --><!DOCTYPE html><html><head> <meta charset="utf-8"> <title>A Django Girl's Adventure</title> <link href=“//…/assets/css/style.css” rel="stylesheet"></head><body>

{% include ‘_header.html’ %}

<div class=“container"> {% block content %} {% endblock content %} </div></body></html>

Include Template

Page 13: Django Templates

Example: base.html <!DOCTYPE html>{% load static %} <html><head> <link rel="stylesheet" href="main.css" /> {% block extra_css %}{% endblock extra_css %} <title> {% block title_tag %} {% block title %} Welcome {% endblock title %} | A Django Girl's Adventure {% endblock title_tag %} </title>

</head><body>

{% include "_header.html" %}

<div class="container"> {% block content %} {% endblock content %} </div>

<script src="{% static 'js/vendors/jquery.js' %}"></script> <script src="{% static 'js/vendors/bootstrap.js' %}"></script> {% block extra_js %}{% endblock extra_js %}</body></html>

Page 14: Django Templates

<!-- home.html -->{% block title %}Home{% endblock title %}

<!-- post.html -->{% block title %}{{ post.title }}{% endblock title %}

<title> {% block title_tag %} {% block title %} Welcome {% endblock title %} | A Django Girl's Adventure {% endblock title_tag %} </title>

<!-- post.html -->{% block title_tag %}{{ post.title }}{% endblock title_tag %}

Home | A Django Girl's Adventure

| A Django Girl's Adventure

Page 15: Django Templates

block.super

| Welcome | A Django Girl's Adventure

<!-- post.html -->{% block title %}{{ post.title }} | {{ block.super }}{% endblock title %}

<title> {% block title_tag %}

{% block title %} Welcome {% endblock title %} | A Django Girl's Adventure

{% endblock title_tag %} </title>

Use {{ block.super }} to include parent’s content

Page 16: Django Templates

Common Conventions

• Prefer underscore over dash in template name, block name

• Included name of the block in endblock tag

• Template called by other template are prefixed with `_`

{% block content %} {% endblock content %}

{% include ‘_header.html’ %}

{% block title_tag %}

Page 17: Django Templates

2-Tier Template Architecture

templates/ base.html home.html # extends base.html trips/ trips_list.html # extends base.html trips_detail.html # extends base.html

Best for websites with a consistent overall layout from app to app

Page 18: Django Templates

3-Tier Template Architecture

templates/ base.html trips/ base_trips.html # extends base.html trips_list.html # extends base_trips.html trips_detail.html # extends base_trips.html album/ base_album.html # extends base.html album_list.html # extends base_album.html album_detail.html # extends base_album.html

Best for websites where each sections requires a distinctive layout

Page 19: Django Templates

Flat is Better Than Nested

Zen of Python

Page 20: Django Templates

Comment

Page 21: Django Templates

Comment in Django Template

{% comment %}<div class="sidebar"> sidebar content is not ready</div>{% endcomment %}

Multi-line Comment

{# single line comment #}

Single Line Comment

<!-- HTML Comment -->

Page 22: Django Templates

Filters

Page 23: Django Templates

Filters

{{ post.title | upper }}

{{ post.title | lower }}

{{ post.title | title }}

post.title = “a wonderFul tRip”

A WONDERFUL TRIP

a wonderful trip

A Wonderful Trip

Page 24: Django Templates

Filters

I have {{ post_list.count }} post{{ post_list.count |pluralize}}

post_list.count = 1

I have 2 postspost_list.count = 2

I have 1 post

Page 25: Django Templates

Filters

{{ post.title|truncatewords:2 }}

{{ value|truncatechars:15 }}

Page 26: Django Templates

django.contrib.humanize

1. Add 'django.contrib.humanize' to your INSTALLED_APPS settings 2. Use {% load humanize %} in a template

<!-- post.html -->{% extends "base.html" %}

{% load humanize %}

{% block title %}{{ post.title }}{% endblock title %}

{% block content %}

<div class="post-heading"> <h1 class="title"><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title | title }}</a> </h1> <div class="date">{{ post.created_at|naturaltime }}</div> </div>

{{ value|naturaltime }}

Page 27: Django Templates

Philosophy

Express Presentation Not Program Logic

Page 28: Django Templates

Summary

• Template Inheritance:

• {% block %} {% end block %}

• {% extends %}

• {{ block.super }}

• Organize: {% include %}

• Comment: {# comment #}, {% comment %}{% endcomment %

• Filters

• upper , lower, title, pluralize, truncatewords, truncatechars

• django.contrib.humanize: naturaltime

Page 29: Django Templates

Thank you