Ceci est ** 5th **, un mémorandum de création d'une application de gestion de partition shogi à l'aide de Django.
L'environnement de travail cette fois-ci est le suivant
De plus, la structure de répertoires de Django ressemble à ceci:
- kifu_app_project/
- kifu_app_project/
- __init__.py
- setting.py
- urls.py
- wsgi.py
- kifu_app/
- migrations/
- templates/
- index.html
- __init__.py
- admin.py
- apps.py
- models.py
- tests.py
- urls.py
- views.py
- manage.py
- .gitignore
Commençons par enregistrer certaines données dans la base de données.
Ensuite, retirez les données avec View et affichez-les avec Template. Ici, les données sont extraites de la table Information et affichées dans une liste.
Créez une nouvelle URL pour ʻinformationList` dans urls.py.
kifu_app/urls.py
from django.urls import path
from . import views
app_name = 'kifu_app'
urlpatterns = [
path('', views.index, name='index'),
path('informationList', views.informationList, name='informationList'), #ajouter à
]
Modifiez views.py comme suit et ajoutez la méthode informationList.
views.py
from django.shortcuts import render
from .models import Information #ajouter à(Vous permet de travailler avec la table d'informations)
#~ Omis ~
def informationList(request):
data = Information.objects.all()
return render(request, 'informationList.html', {'data': data})
La partie importante est ʻInformation.objects.all () `. Les données sont extraites de la table d'informations de cette partie. Ici, toutes les données sont récupérées par la méthode all.
Vous pouvez également sélectionner et trier ceux qui répondent à vos critères spécifiques en choisissant la bonne méthode. Les personnes suivantes l'ont résumé, donc je pense que ce sera utile. [Résumé des opérations de la base de données Django] 1
Ensuite, créons informationList.html et affichons les données transmises à partir de View pour le moment.
informationList.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Kifu APP</title>
</head>
<body>
<h3>{{ data }}</h3>
</body>
</html>
Ensuite, vous verrez quelque chose comme ce qui suit à l'écran.
Ensuite, tournons les données avec for et extrayons-les une par une.
informationList.html
<body>
{% for each_data in data %}
<h3>{{ each_data }}</h3>
{% endfor %}
</body>
Avec cela, je sens que je ne peux récupérer que la date et l'heure du jeu.
Cependant, c'est parce que lorsque la méthode \ _ \ _ str__ a été ajoutée à la classe Information de models.py dans la partie 3, self.date a été renvoyée, et je pense qu'il est en fait bon de la reconnaître comme Object.
Récupérons donc les données individuelles contenues dans l'objet.
Pour accéder aux données individuelles, connectez les variables de colonne définies dans models.py à l'opérateur.
informationList.html
<body>
{% for each_data in data %}
<h3>{{ each_data }}</h3>
<table border="1">
<tr>
<td>{{ each_data.date }}</td>
<td>{{ each_data.sente }}</td>
<td>{{ each_data.gote }}</td>
<td>{{ each_data.small_class }}</td>
</tr>
</table>
{% endfor %}
</body>
J'ai pu afficher correctement les données individuelles!
Ensuite, vous pouvez accéder à chaque page de détails à partir de l'écran de liste.
Il n'est pas pratique de créer un fichier HTML pour chaque donnée lorsque vous essayez de créer une page de détails. Il est courant de préparer un modèle pour l'écran de détails et de modifier la valeur affichée en fonction des données sélectionnées.
Ce que vous devez faire à ce moment-là, c'est que ** les informations sur les données sélectionnées doivent être envoyées à Afficher à partir du modèle (écran de liste) **. Sans cela, la vue ne saurait pas quelles données détaillées transmettre au modèle (écran de détail).
Une pratique courante consiste à mettre les informations dans l'URL.
Par exemple, mettons l'ID des données sur l'URL. Ensuite, si l'URL est / informationDetail / 2
, vous pouvez juger à partir de View que vous devez récupérer les données avec ID = 2.
Maintenant, implémentons une telle fonction.
Tout d'abord, créez une URL. Cependant, contrairement à avant, la partie où l'ID est placé n'est pas une valeur fixe mais une valeur variable, alors écrivez-la d'une manière acceptable. Plus précisément, c'est comme suit.
kifu_app/urls.py
urlpatterns = [
path('', views.index, name='index'),
path('informationList', views.informationList, name='informationList'),
path('informationDetail/<int:information_id>', views.informationDetail, name='informationDetail'),
]
La partie pour laquelle vous voulez créer une valeur de variable est OK si vous décrivez l'URL sous la forme «<type: nom de la variable>». (Très facile!)
Ensuite, la vue ressemble à ci-dessous.
views.py
from django.shortcuts import render
from .models import Information
from django.shortcuts import get_object_or_404 #ajouter à
#~ Omis ~
def informationDetail(request, information_id):
detail = get_object_or_404(Information, pk=information_id)
return render(request, 'informationDetail.html', {'detail': detail})
Puisque le nom de la variable a été défini sur ʻinformation_id dans le paramètre d'URL précédemment, ajoutez ʻinformation_id
à l'argument de la méthode à appeler.
Veuillez noter qu'une erreur se produira si ce nom de variable est différent de celui écrit dans l'URL.
Il existe également une nouvelle méthode appelée get_object_or_404
, qui est
try:
detail = Information.objects.get(pk=information_id)
except Information.DoesNotExist:
raise Http404("Information does not exist")
Ce n'est pas grave si vous reconnaissez que le travail de est écrit sur une seule ligne.
Procédez simplement comme suit:
informationDetail.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Kifu APP</title>
</head>
<body>
<h3>{{ detail }}</h3>
<table border="1">
<tr>
<td>{{ detail.id }}</td>
<td>{{ detail.date }}</td>
<td>{{ detail.sente }}</td>
<td>{{ detail.gote }}</td>
<td>{{ detail.result }}</td>
<td>{{ detail.my_result }}</td>
<td>{{ detail.small_class }}</td>
<td>{{ detail.created_at }}</td>
<td>{{ detail.updated_at }}</td>
</tr>
</table>
</body>
</html>
Enfin, créez un lien dans informationList.html afin de pouvoir effectuer la transition vers informationDetail.html.
Pour créer un lien, Template utilise la balise a ainsi que HTML, mais le problème est de savoir comment spécifier la destination dans l'attribut href. À mesure que le projet se développera à l'avenir, la structure des répertoires peut changer. Dans un tel cas, si l'attribut href est spécifié comme chemin relatif, le chemin doit être réécrit un par un, ce qui est très gênant.
Par conséquent, dans Django, la destination est spécifiée en utilisant "nom d'URL" sans écrire concrètement le chemin. Plus précisément, c'est comme suit.
informationList.html
<td><a href="{% url 'kifu_app:informationDetail' %}">{{ each_data.date }}</a></td>
Après l'avoir enfermé dans {%%}
, écrivez ʻurl`.
Ensuite, lors de la création d'une URL dans urls.py, décrivez le nom de l'URL * spécifié dans l'attribut * name avec le nom_app de cette urls.py.
En d'autres termes, "suivez le chemin de l'URL Conf nommée informationDetail dans l'URLConf nommée kifu_app".
De plus, cette fois, je veux passer une valeur au chemin, qui s'écrit comme suit.
informationList.html
<td><a href="{% url 'kifu_app:informationDetail' each_data.id %}">{{ each_data.date }}</a></td>
Cela passera la valeur de each_data.id à l'URL spécifiée!
Quand je le vérifie réellement ... Si vous cliquez davantage sur le lien ... Ça a marché!
Jusqu'à présent, nous avons implémenté les fonctions List et Detail, mais comme cette fonction est souvent utilisée lors de la création d'un projet, Django est conçu pour que la partie View puisse être facilement implémentée.
Pour plus de détails, les personnes suivantes sont très faciles à comprendre et à écrire en détail, veuillez vous y référer.
[Introduction à la vue générique basée sur les classes dans Django et exemple d'utilisation] 2
[Modèle de fractionnement] 3