Modèle Django
Dans le chapitre précédent, nous avons utilisé django.http.HttpResponse() pour afficher "Hello World!". Cette méthode mélange des données et des vues, ce qui n'est pas conforme à l'idée MVC de Django.
Dans ce chapitre, nous présenterons en détail l'application du modèle Django. Un modèle est un texte utilisé pour séparer la forme de présentation et le contenu d'un document.
Exemple d'application de modèle
Nous allons poursuivre le projet du chapitre précédent et créer le répertoire des modèles sous le répertoire HelloWorld et créer le fichier hello.html. La structure entière du répertoire est la suivante. suit :
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.htmlLe code du fichier
hello.html est le suivant :
<h1>{{ hello }}</h1>
D'après le modèle, nous savons que la variable utilise des doubles crochets.
Ensuite, nous devons expliquer le chemin du fichier modèle vers Django, modifier HelloWorld/settings.py et modifier le DIRS dans TEMPLATES en [BASE_DIR+"/templates",], comme montré ci-dessous :
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', ], }, }, ]
Nous modifions maintenant view.py et ajoutons un nouvel objet pour soumettre des données au modèle :
# -*- 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)
Comme vous pouvez le voir, nous utilisons render ici pour remplacer la HttpResponse utilisée auparavant . render utilise également un contexte de dictionnaire comme paramètre.
La valeur clé "hello" de l'élément dans le dictionnaire contextuel correspond à la variable "{{ hello }}" dans le modèle.
Visitez à nouveau http://192.168.45.3:8000/hello/, vous pouvez voir la page :
De cette façon, nous avons terminé l'utilisation de modèles pour sortir les données , réalisant ainsi les données détachées de la vue.
Ensuite, nous présenterons en détail les règles grammaticales couramment utilisées dans les modèles.
Balise de modèle Django
balise if/else
Le format de syntaxe de base est le suivant :
{% if condition %} ... display {% endif %}
ou :
{% if condition1 %} ... display 1 {% elif condiiton2 %} ... display 2 {% else %} ... display 3 {% endif %}
Selon le jugement conditionnel, s'il faut sortir. if/else prend en charge l'imbrication.
La balise {% if %} accepte et, ou non, des mots-clés pour juger plusieurs variables, ou pour nier des variables (non), par exemple :
{% if athlete_list and coach_list %} athletes 和 coaches 变量都是可用的。 {% endif %}
pour la balise
{% for %} nous permet de parcourir une séquence.
Semblable à l'instruction for de Python, la syntaxe de la boucle est for X in Y , où Y est la séquence à itérer et X est le nom de la variable utilisée dans chaque boucle particulière.
Dans chaque boucle, le système de modèles restituera tout entre {% for %} et {% endfor %}.
Par exemple, étant donné une liste d'athlètes dans la variable athlètes_list, on peut utiliser le code suivant pour afficher la liste :<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
Ajouter un inversé au label pour que la liste est itéré à l'envers :
{% for athlete in athlete_list reversed %} ... {% endfor %}
peut être imbriqué à l'aide des balises {% for %} :
{% for athlete in athlete_list %} <h1>{{ athlete.name }}</h1> <ul> {% for sport in athlete.sports_played %} <li>{{ sport }}</li> {% endfor %} </ul> {% endfor %}
balise ifequal/ifnotequal
La balise {% ifequal %} compare deux valeurs quand ils sont égaux, affiche toutes les valeurs comprises entre {% ifequal %} et {% endifequal %}.
L'exemple suivant compare deux variables de modèle user et currentuser :
{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}
Similaire à {% if %}, {% ifequal %} prend en charge la balise facultative {% else%} : 8
{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}
Balises d'annotation
Les annotations Django utilisent {# #}.
{# 这是一个注释 #}
Filtre
Les filtres de modèle peuvent modifier les variables avant qu'elles ne soient affichées. Les filtres utilisent le caractère pipe, comme indiqué ci-dessous :
{{ name|lower }}
{{ name }} Une fois la variable traitée par le filtre inférieur, le texte de conversion en majuscules du document est en minuscules.
Les tuyaux de filtre peuvent être *socketés*, c'est-à-dire que la sortie d'un tuyau de filtre peut être utilisée comme entrée du tuyau suivant :
{{ my_list|first|upper }}
L'exemple ci-dessus prend le premier élément et convertit en majuscule.
Certains filtres ont des paramètres. Les arguments de filtre suivent deux points et sont toujours placés entre guillemets. Par exemple :
{{ bio|truncatewords:"30" }}
Cela affichera les 30 premiers mots de la variable bio.
Autres filtres :
addslashes : Ajoute une barre oblique inverse avant toute barre oblique inverse, guillemet simple ou guillemet double.
date : formate l'objet date ou datetime en fonction du paramètre de chaîne de format spécifié. Exemple :
{{ pub_date|date:"F j, Y" }}
length : renvoie la longueur du. variable.
balise include
La balise {% include %} permet d'inclure le contenu d'autres modèles dans le modèle.
Les deux exemples suivants incluent le modèle nav.html :
{% include "nav.html" %}
Héritage des modèles
Les modèles peuvent être réutilisés via l'héritage.
Ensuite, nous créons d'abord le fichier base.html dans le répertoire templates du projet précédent. Le code est le suivant :
<html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>
Dans le code ci-dessus, la balise de bloc nommée mainbody peut être. remplacé par les successeurs déchus.
Toutes les balises {% block %} indiquent au moteur de modèles que les modèles enfants peuvent remplacer ces parties.
hello.html hérite de base.html et remplace des blocs spécifiques. Le code modifié de hello.html est le suivant :
{% extends "base.html" %} {% block mainbody %} <p>继承了 base.html 文件</p> {% endblock %}
La première ligne de code indique que hello.html hérite de la base. fichier html. Comme vous pouvez le voir, la balise block du même nom est utilisée ici pour remplacer le bloc correspondant dans base.html.
Revisitez l'adresse http://192.168.45.3:8000/hello/, le résultat de sortie est le suivant :