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 2 → Résumé du didacticiel
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.
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.
$ ./manage.py startapp appname
.project / settings.py
dans
project / urls.py`.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.
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 /.
Il semble que la connexion soit réussie.
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.
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')
Il semble qu'il renvoie une chaîne de caractères en utilisant correctement le 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>
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>
Il semble que la balise piyo a été sortie sans être échappée.
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>
C'est un peu pas cool, mais ça semble bien sortir.
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>
Ça ressemble à ça.
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.
La page de détails est terminée.
Source → ʻe86d795→
da8d171`
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.
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.
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,
})
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>
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>
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.
Recommended Posts