Tutoriel Python Django (3)

Ceci est un matériel pour les sessions d'étude. J'expliquerai en suivant le tutoriel de django1.8. https://docs.djangoproject.com/en/1.8/intro/tutorial03/

Le document officiel japonais est la dernière version 1.4, il y a donc quelques différences, mais le flux général est le même, c'est donc une bonne idée de le lire. http://django-docs-ja.readthedocs.org/en/latest/intro/tutorial03.html

Tutoriel 1 Tutoriel 2Résumé du didacticiel

Aperçu

Dans ce didacticiel, nous expliquerons la vue et l'url. Bien qu'il soit appelé vue, il équivaut à un contrôleur en général MVC. L'équivalent de MVC View est un modèle appelé depuis view.

Je dis quelque chose à propos de MVC, alors écoutez-le légèrement.

Créer une vue et connecter une URL

Document → https://docs.djangoproject.com/en/1.8/intro/tutorial03/#write-your-first-view Source → 7f5128a 3efdc15

Dans ce tutoriel, nous expliquerons les 5ème à 7ème parties de la création d'application expliquées dans le tutoriel (1).

Avant cela, je vais vous expliquer le déroulement de la création d'une application avec django.

  1. Ajoutez une application avec $ ./manage.py startapp appname.
  1. Décrivez le modèle (table de base de données) utilisé dans l'application dans ʻappname / models.py`.
  1. Ajoutez l'application créée à project / settings.py
  1. Mise à jour de la base de données
  1. Décrivez l'affichage et le fonctionnement du modèle (ajout, édition, etc.) dans ʻappname / views.py`. Le html à utiliser est également préparé ici.
  2. Écrivez ʻappname / urls.py` et associez l'URL aux vues
  3. Lisez ʻappname / urls.py dans project / urls.py`.

Ajouter une vue

view est une fonction qui reçoit HttpRequest et renvoie HttpResponse.

Écrivons la fonction view en suivant le tutoriel original.

polls/views.py


from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

La méthode view reçoit toujours la classe HttpRequest comme premier argument. De plus, il est nécessaire de renvoyer la classe HttpResponse (ou une classe qui en hérite) comme valeur de retour.

Bien sûr, vous ne pouvez pas comprendre l'opération à partir de cela seul, alors connectons l'URL et la vue.

paramètre d'URL

La méthode et le concept de paramétrage de l'URL ont considérablement changé dans django1.8, donc soyez prudent si vous continuez en regardant le tutoriel japonais original (django1.4).

Lors de l'accès à django, vérifiez d'abord ROOT_URLCONF (project / urls.py par défaut, tutoriel / urls.py dans ce tutoriel) pour voir quelle vue appeler.

Un tableau appelé ʻurl patterns` est défini dans urls.py. Les éléments du tableau sont ajoutés avec la fonction url.

Le contenu est ʻurl resolver`, mais je vais l'omettre car ce sera une histoire maniaque.

La fonction url connecte l'url à la vue, ou l'url à d'autres modèles d'URL.

Regardons en fait la source.

polls/urls.py


from django.conf.urls import url

from . import views


urlpatterns = [
    url(r'^$', views.index, name='index'),  #Lier l'URL et la vue
]

À ce stade, polls.views.index et url de polls étaient connectés, mais polls.urls n'est pas root_url. Il ne peut pas encore être confirmé depuis le navigateur.

tutorial/urls.py


from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^polls/', include('polls.urls')),  #Lier l'URL à d'autres modèles d'URL
]

Le root_url a été mis à jour. Maintenant, l'url qui correspond à polls / appellera polls.urls et vous pouvez la voir dans votre navigateur.

Accédons à http: // localhost: 8000 / polls /.

Kobito.JVhyfF.png

Il semble que la connexion soit réussie.

fonction url

Dans la fonction url, décrivez l'expression régulière d'url dans le premier argument et transmettez la valeur de retour de la fonction view ou include function dans le second argument. Si vous écrivez> r '', il peut être confondu avec une expression régulière, mais il s'agit d'une chaîne de caractères brute.

\ Sera affiché tel quel à la place du caractère d'échappement. Le troisième argument, name = 'index'), est pour l'URL inversée. Il est utilisé pour rediriger vers une autre vue et créer un lien dans un modèle.

Lorsque include est utilisé, la partie dans laquelle la chaîne de caractères correspondante est supprimée est transmise aux modèles d'URL suivants.

Utilisation du modèle

Document → https://docs.djangoproject.com/en/1.8/intro/tutorial03/#a-shortcut-render Source → 3efdc15 18eb3f6

La connexion entre l'URL et la vue a réussi, mais la chaîne de caractères de réponse n'est pas tellement manuscrite. Ensuite, utilisons le modèle.

Le modèle est installé sous ʻapp / templates / app / . Le format est presque le même que le html général, mais si vous le placez avec deux crochets intermédiaires comme {{var}} Vous pouvez utiliser la valeur transmise depuis python. Vous pouvez également exécuter une fonction appelée balise de modèle au format{% func%}`.

Tout d'abord, créez-le en utilisant du HTML normal.

polls/templates/polls/index.html


<html>
<body>
  <p>Hello, world. You're at the polls index.</p>
  <p>template version!</p>
</body>
</html>

Puis réécrivez la vue. Le didacticiel d'origine explique comment créer une chaîne de caractères à l'aide d'un modèle, mais Cette fois, je vais vous montrer comment l'ignorer et utiliser la fonction de rendu. Cette fonction vous donnera le résultat du rendu à l'aide de ce modèle lorsque vous transmettez la demande et le chemin du modèle. Il sera renvoyé en tant que HttpResponse. Modifiez la source comme suit et vérifiez-la avec un navigateur.

polls/views.py


from django.shortcuts import render


def index(request):
    return render(request, 'polls/index.html')

Kobito.W5zmjU.png

Il semble qu'il renvoie une chaîne de caractères en utilisant correctement le modèle.

Passer par valeur au modèle

Source → 1ade762 c49d0c6

À présent, vous devriez être en mesure de créer des pages statiques. Ensuite, créons une page dynamique. Vous pouvez passer une valeur au template en passant un dictionnaire au troisième argument de render. Lorsque vous utilisez la valeur transmise dans le modèle, écrivez-la au format {{var}}.

Réécrivons la vue et passons une valeur appropriée.

polls/views.py


from django.shortcuts import render


def index(request):
    return render(request, 'polls/index.html', {
        'hoge': 'test string',
        'fuga': '<br>tag</br>',
    })

Ensuite, réécrivez le html et affichez la valeur reçue.

polls/templates/polls/index.html


<html>
<body>
  <p>Hello, world. You're at the polls index.</p>
  <p>template version!</p>
  <p>{{ hoge }}</p>
  <p>{{ fuga }}</p>
</body>
</html>

Kobito.glaQa6.png

Il semble que la valeur reçue s'affiche correctement. Cependant, dans fuga, la balise <br> a été échappée et sortie. Je suis satisfait de la sécurité, mais j'ai des problèmes lorsque je veux générer des balises. Pour sortir la balise, utilisez la fonction django.utils.html.mark_safe. Comme son nom l'indique, cette fonction marque la chaîne comme sûre et l'empêche d'être échappée plus.

Passons une nouvelle chaîne de caractères avec mark_sake à piyo et la sortons.

polls/views.py


from django.shortcuts import render
from django.utils.html import mark_safe


def index(request):
    return render(request, 'polls/index.html', {
        'hoge': 'test string',
        'fuga': '<br>tag</br>',
        'piyo': mark_safe('<br>tag</br>'),
    })

polls/templates/polls/index.html


<html>
<body>
  <p>Hello, world. You're at the polls index.</p>
  <p>template version!</p>
  <p>{{ hoge }}</p>
  <p>{{ fuga }}</p>
  <p>{{ piyo }}</p>
</body>
</html>

Kobito.8qg0k1.png

Il semble que la balise piyo a été sortie sans être échappée.

Coopération avec le modèle

Source → c49d0c6 95339e5

Maintenant que je suis assez satisfait de la chaîne, affichons le modèle Question. Cela dit, vous transmettez simplement une instance du modèle ou un ensemble de requêtes au lieu d'une chaîne. Une explication détaillée de l'ensemble de requêtes sera donnée ultérieurement. Pour l'instant, gardez à l'esprit que vous pouvez obtenir l'ensemble de requêtes pour ce modèle avec Model.objects.

Si vous souhaitez le savoir immédiatement, veuillez vous référer au document original. → https://docs.djangoproject.com/en/1.8/ref/models/querysets/

Essayons de transmettre tous les objets du modèle Question au modèle avec le nom questions.

polls/views.py


from django.shortcuts import render

from .models import Question


def index(request):
    return render(request, 'polls/index.html', {
        'questions': Question.objects.all(),
    })

Affichons-le en html et vérifions-le avec un navigateur.

polls/templates/polls/index.html


<html>
<body>
  {{ questions }}
</body>
</html>

Kobito.nM35Me.png

C'est un peu pas cool, mais ça semble bien sortir.

Modifier l'affichage du modèle

Source → 95339e5 943e24b

Puisque les questions sont un tableau, utilisez la fonction {% for%} fournie en standard dans le modèle pour améliorer l'apparence.

polls/templates/polls/index.html


<html>
<body>
  <table border="1">
    <tr>
      <th>Contenu de la question</th>
      <th>date de sortie</th>
    </tr>
    {% for question in questions %}
    <tr>
      <td>{{ question.question_text }}</td>
      <td>{{ question.pub_date }}</td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

Kobito.LmxoBX.png

Ça ressemble à ça.

Ajouter un écran de détail

Source → 943e24b → ʻe86d795`

L'écran de liste est bon pour le moment, mais créons cette fois un écran de détail individuel. Le flux est le même, il suffit de préparer une vue et de connecter l'url, Puisqu'il s'agit d'un écran de détail, il est nécessaire de spécifier un objet spécifique dans le modèle. Cette fois, en tant que méthode générale de django, nous recevrons le pk de l'objet.

La vue ressemble à ceci.

polls/views.py


...
def detail(request, pk):
    return render(request, 'polls/detail.html', {
        'question': Question.objects.get(pk=pk)
    })

N'oubliez pas de préparer detail.html qui est appelé depuis la vue.

polls/templates/polls/detail.html


<html>
<body>
  {{ question }}
</body>
</html>

Ensuite, modifiez l'URL. url peut être passée à la fonction view avec la chaîne de caractères dans url comme argument au format (? P <kwarg> pattern).

polls/urls.py


...
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'(?P<pk>\d+)/$', views.detail, name='poll_detail'),
]

Dans ce cas, comme http: // localhost: 8000 / polls / 1 / ou http: // localhost: 8000 / polls / 3 / Cela signifie que les nombres 1 et 3 sont passés à la fonction de détail en tant qu'argument de pk.

Kobito.WlPWYR.png

Kobito.cJ7N4Z.png

La page de détails est terminée.

Ajout de 404 pages

Source → ʻe86d795da8d171`

L'écran de détails a été créé, mais si vous entrez un pk inexistant tel que 10 dans l'URL, l'écran ressemblera à celui ci-dessous.

Kobito.mFw3WE.png

La méthode Model.objects.get lève une exception de DoesNotExist lorsque l'objet ne peut pas être acquis dans les conditions spécifiées, ce qui donne un écran comme celui-ci. La valeur de retour de la fonction view doit être HttpResponse, modifions-la donc pour qu'elle détecte l'exception et affiche la page 404.

polls/views.py


from django.shortcuts import Http404
...
def detail(request, pk):
    try:
        obj = Question.objects.get(pk=pk)
    except Question.DoesNotExist:
        raise Http404
    return render(request, 'polls/detail.html', {
        'question': obj,
    })

Il semble que vous lancez une exception Http404 au lieu de HttpResponse, mais Si vous déclenchez l'exception Http404, le middleware l'attrapera et créera une page pour 404.

Kobito.fcoOLN.png

Une page 404 un peu plus pratique

Source → da8d171 2b823b3

Comme il s'agit d'une opération générale d'essayer d'obtenir un objet avec une clé primaire, etc. et de renvoyer 404 sinon Une fonction de raccourci pratique est fournie. Vous pouvez écrire la même opération qu'avec try-except en écrivant simplement à partir de quel modèle et dans quelles conditions.

polls/views.py


from django.shortcuts import get_object_or_404
...
def detail(request, pk):
    obj = get_object_or_404(Question, pk=pk)
    return render(request, 'polls/detail.html', {
        'question': obj,
    })

Connexion de la page de liste à l'écran de détail

Documents → https://docs.djangoproject.com/en/1.8/intro/tutorial03/#removing-hardcoded-urls-in-templates Source → 2b823b3 99b01e3

Maintenant que la page de liste et l'écran de détails ont été créés, mettons un lien de la page de liste à l'écran de détails. Utilisez la balise {% url%} pour intégrer un lien en html. L'url est générée en passant le nom de l'url à l'argument de cette balise. Le nom de l'url </ b> ici est le name = 'hoge' spécifié dans le troisième argument de la fonction url.

Dans les didacticiels jusqu'à présent, les noms «index» et «poll_detail» sont définis. Cette fois, nous allons créer un lien vers poll_detail dans index.html. Notez que poll_detail doit recevoir le pk de l'objet question comme argument.

polls/templates/polls/index.html


<html>
<body>
  <table border="1">
    <tr>
      <th>Contenu de la question</th>
      <th>date de sortie</th>
      <th></th>
    </tr>
    {% for question in questions %}
    <tr>
      <td>{{ question.question_text }}</td>
      <td>{{ question.pub_date }}</td>
      <td><a href="{% url 'poll_detail' question.pk %}">Vers l'écran de détail</a></td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

Kobito.hqbo81.png

Le lien vers l'écran des détails a été publié avec succès.

De plus, mettons un lien de l'écran de détails à l'écran de liste.

polls/templates/polls/detail.html


<html>
<body>
  <a href="{% url 'index' %}">Vers l'écran de liste</a><br>
  {{ question }}
</body>
</html>

Kobito.AvWWsf.png

Vous n'avez plus besoin de taper directement l'URL.

-- L'ordre des explications était légèrement différent de celui du tutoriel d'origine, mais dans le prochain tutoriel, nous traiterons des formulaires.

Vers le prochain tutoriel

Résumé du didacticiel

Recommended Posts

Tutoriel Python Django (5)
Tutoriel Python Django (2)
Tutoriel Python Django (8)
Tutoriel Python Django (6)
Tutoriel Python Django (7)
Tutoriel Python Django (1)
Tutoriel du didacticiel Python Django
Tutoriel Python Django (3)
Tutoriel Python Django (4)
Tutoriel Python
Fiche technique du didacticiel Python Django
Résumé du didacticiel Python
mémo du didacticiel django
Démarrer le didacticiel Django 1
Django 1.11 a démarré avec Python3.6
Tutoriel [Docker] (Python + php)
Framework Web Django Python
Didacticiel sur les associations polymorphes Django
tutoriel simple django oscar
Table de décalage Django Python
Essayez Debian + Python 3.4 + django1.7 ……
Mémo du didacticiel Python OpenCV
[Tutoriel Python] Structure des données
Note du didacticiel Django Girls
Tutoriel Cloud Run (python)
Python Django CSS reflété
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
Introduction à Python Django (2) Win
[Tutoriel Python] Outil de structure de contrôle
Faites Django avec CodeStar (Python3.8, Django2.1.15)
Python3 + Django ~ Mac ~ avec Apache
Création de liste de tâches [Python Django]
Premiers pas avec Python Django (1)
Lancez-vous avec Django! ~ Tutoriel ④ ~
Django
Premiers pas avec Python Django (4)
Premiers pas avec Python Django (3)
Installez Python 3.7 et Django 3.0 (CentOS)
[Python] Tutoriel personnel sur l'arbre de décision
Histoire addictive GAE + python + Django
Introduction à Python Django (6)
Premiers pas avec Python Django (5)
Jusqu'à la sortie de Python [Django] de Web service [Tutorial Part 1]
Analyse des ondes cérébrales avec Python: tutoriel Python MNE
8 commandes fréquemment utilisées dans Python Django
Python practice_Configuration de l'environnement virtuel ~ Installation de Django
Créer une nouvelle application utiliser python, django
python + django + scikit-learn + mecab (1) avec heroku
Exécutez python3 Django1.9 avec mod_wsgi (déployer)
Résumé du didacticiel Django Girls Première moitié
Trébucher lors du didacticiel django 1.7
Déployer le didacticiel Django sur IIS ①
Installer le framework Python django à l'aide de pip
Introduction à Python Django (2) Édition Mac
[Tutoriel Python] Une introduction facile à Python
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 5 ~
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 4 ~
Historique d'apprentissage pour participer au développement d'applications d'équipe avec Python ~ Tutoriel Django 1, 2, 3 ~
Historique d'apprentissage pour participer au développement d'applications d'équipe en Python ~ Tutoriel Django 7 ~
Tutoriel Django Crispy (Construction d'environnement sur Mac)