Templat Django


Dalam bab sebelumnya kami menggunakan django.http.HttpResponse() untuk mengeluarkan "Hello World!". Kaedah ini mencampurkan data dan pandangan, yang tidak mematuhi idea MVC Django.

Dalam bab ini kami akan memperkenalkan aplikasi templat Django secara terperinci Templat ialah teks yang digunakan untuk memisahkan borang pembentangan dan kandungan dokumen.


Contoh aplikasi templat

Kami akan meneruskan projek dalam bab sebelumnya dan mencipta direktori templat di bawah direktori HelloWorld dan mencipta fail hello.html Keseluruhan struktur direktori adalah sebagai berikut:

HelloWorld/
|-- HelloWorld
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py
|   |-- urls.pyc
|   |-- view.py
|   |-- view.pyc
|   |-- wsgi.py
|   `-- wsgi.pyc
|-- manage.py
`-- templates
    `-- hello.html
Kod fail

hello.html adalah seperti berikut:

<h1>{{ hello }}</h1>

Dari templat, kita tahu bahawa pembolehubah menggunakan kurungan berganda.

Seterusnya kita perlu menerangkan laluan fail templat kepada Django, ubah suai HelloWorld/settings.py, dan ubah suai DIRS dalam TEMPLATES kepada [BASE_DIR+"/templates",], sebagai ditunjukkan di bawah:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR+"/templates",],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

Kami kini mengubah suai view.py dan menambah objek baharu untuk menyerahkan data ke templat:

# -*- coding: utf-8 -*-

#from django.http import HttpResponse
from django.shortcuts import render

def hello(request):
    context          = {}
    context['hello'] = 'Hello World!'
    return render(request, 'hello.html', context)

Seperti yang anda lihat, kami menggunakan render di sini untuk menggantikan HttpResponse yang digunakan sebelum ini . render juga menggunakan konteks kamus sebagai parameter.

Nilai utama "hello" unsur dalam kamus konteks sepadan dengan pembolehubah "{{ hello }}" dalam templat.

Lawati http://192.168.45.3:8000/hello/ sekali lagi, anda boleh melihat halaman:

1041.jpg

Dengan cara ini, kami telah melengkapkan penggunaan templat untuk mengeluarkan data , dengan itu merealisasikan data Terpisah daripada pandangan.

Seterusnya kami akan memperkenalkan secara terperinci peraturan tatabahasa yang biasa digunakan dalam templat.


Teg templat Django

teg if/else

Format sintaks asas adalah seperti berikut:

{% if condition %}
     ... display
{% endif %}

atau:

{% if condition1 %}
   ... display 1
{% elif condiiton2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

Mengikut pertimbangan Bersyarat sama ada untuk mengeluarkan. jika/lain menyokong sarang.

{% jika %} teg menerima dan, atau tidak kata kunci untuk menilai berbilang pembolehubah, atau untuk menafikan pembolehubah (bukan), contohnya:

{% if athlete_list and coach_list %}
     athletes 和 coaches 变量都是可用的。
{% endif %}

untuk teg

{% untuk %} membolehkan kami mengulangi urutan.

Sama seperti penyataan Python untuk, sintaks gelung adalah untuk X dalam Y , dengan Y ialah urutan untuk lelaran dan X ialah nama pembolehubah yang digunakan dalam setiap gelung tertentu.

Dalam setiap gelung, sistem templat akan memaparkan segala-galanya antara {% untuk %} dan {% endfor %}.

Sebagai contoh, diberikan senarai atlet dalam pembolehubah senarai_atlet, kita boleh menggunakan kod berikut untuk memaparkan senarai:


<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

Tambahkan terbalik pada label supaya senarai diulang secara terbalik:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

boleh disarang menggunakan teg {% untuk %}:

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

teg ifequal/ifnotequal

{% ifequal %} tag membandingkan dua nilai ​​apabila ia sama , memaparkan semua nilai antara {% ifequal %} dan {% endifequal %}.

Contoh berikut membandingkan dua pembolehubah templat pengguna dan pengguna semasa:

{% ifequal user currentuser %}
    <h1>Welcome!</h1>
{% endifequal %}

Sama seperti {% if %}, {% ifequal %} menyokong teg {% else%} pilihan: 8

{% ifequal section 'sitenews' %}
    <h1>Site News</h1>
{% else %}
    <h1>No News Here</h1>
{% endifequal %}

Teg Anotasi

Anotasi Django menggunakan {# #}.

{# 这是一个注释 #}

Penapis

Penapis templat boleh mengubah suai pembolehubah sebelum ia dipaparkan Penapis menggunakan aksara paip, seperti ditunjukkan di bawah:

{{ name|lower }}

{{ name }} Selepas pembolehubah diproses oleh penapis bawah, teks penukaran huruf besar dokumen adalah huruf kecil.

Paip penapis boleh *soket* iaitu keluaran satu paip penapis boleh digunakan sebagai input paip seterusnya:

{{ my_list|first|upper }}

Contoh di atas mengambil elemen pertama dan Tukar kepada huruf besar.

Sesetengah penapis mempunyai parameter. Argumen penapis mengikut titik bertindih dan sentiasa disertakan dalam petikan berganda. Contohnya:

{{ bio|truncatewords:"30" }}

Ini akan memaparkan 30 perkataan pertama bagi bio pembolehubah.

Penapis lain:

  • tambah garis miring : Menambah garis miring ke belakang sebelum sebarang garis miring ke belakang, petikan tunggal atau petikan berganda.

  • tarikh: Format tarikh atau objek datetime mengikut parameter rentetan format yang ditentukan Contoh:

    {{ pub_date|date:"F j, Y" }}
  • panjang: Kembalikan panjang panjang. pembolehubah.

serta teg

{% include %} tag membolehkan kandungan templat lain dimasukkan ke dalam templat.

Kedua-dua daripada dua contoh berikut termasuk templat nav.html:

{% include "nav.html" %}

Warisan templat

Templat boleh digunakan semula melalui pewarisan.

Seterusnya, kami mula-mula mencipta fail base.html dalam direktori templat projek sebelumnya Kodnya adalah seperti berikut:

<html>
  <head>
    <title>Hello World!</title>
  </head>

  <body>
    <h1>Hello World!</h1>
    {% block mainbody %}
       <p>original</p>
    {% endblock %}
  </body>
</html>

Dalam kod di atas, tag blok bernama mainbody boleh menjadi. digantikan oleh pengganti yang jatuh.

Semua teg {% block %} memberitahu enjin templat bahawa templat anak boleh mengatasi bahagian ini.

hello.html mewarisi base.html dan menggantikan blok tertentu Kod hello.html yang diubah suai adalah seperti berikut:

{% extends "base.html" %}

{% block mainbody %}
<p>继承了 base.html 文件</p>
{% endblock %}

Barisan pertama kod menunjukkan bahawa hello.html mewarisi asas. fail html. Seperti yang anda lihat, teg blok dengan nama yang sama di sini digunakan untuk menggantikan blok yang sepadan dalam base.html.

Lawati semula alamat http://192.168.45.3:8000/hello/, hasil output adalah seperti berikut:

1042.jpg