day = get_object_or_404(Day, pk=pk)
Le traitement suivant est le même flux que la fonction d'ajout.Voici la page de sortie du résultat de l'apprentissage de Django chez Udemy. L'article précédent est ici .
Cette fois, j'aimerais créer une application de journal super simple avec Django. De plus, cette fois, afin d'approfondir la compréhension du fonctionnement de Django, nous n'utiliserons pas la vue générale basée sur les classes, mais la créerons uniquement avec des fonctions.
haut de page
Page de détails
Mettre à jour la page
Supprimer la page
Tout d'abord, de la construction de l'environnement. Créez un projet appelé Second et une application Django appelée journal. Le nom du projet est arbitraire, mais il est prudent d'utiliser uniquement des caractères alphanumériques demi-largeur si possible. S'il y a des traits de soulignement ou des espaces vides dans le nom du projet, une erreur mystérieuse peut se produire dans la procédure décrite ci-dessous.
django-admin startproject Second
cd diary_project
py .\manage.py startapp diary
Enregistrez l'application Agenda dans settings.py et réglez l'heure japonaise
Second\Second\sattings.py
INSTALLED_APPS = [
'diary',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
models.py Cette fois, le processus d'enregistrement des données dans la base de données de Django se produira, alors définissez le type de données qui sera placé dans la base de données dans models.py. Inversement, si vous regardez models.py, vous pouvez voir quels champs de données sont préparés dans la base de données de Django. De plus, si vous ne définissez pas explicitement la clé primaire dans models.py, la clé primaire appelée id sera définie automatiquement.
Second\Second\models.py
from django.db import models
from django.utils import timezone
class Day(models.Model):
#Je ne l'ai pas déclaré ici, mais la clé primaire appelée id est automatiquement enregistrée.
title = models.CharField('Titre', max_length=200)
text = models.TextField('Texte')
date = models.DateField('Date', default=timezone.now)
Après avoir entré models.py, enregistrez-le dans la base de données avec manage.py. Accédez au dossier où manage.py est enregistré et enregistrez-le avec la commande suivante.
py .\manage.py makemigrations
py .\manage.py migrate
Lors de l'exécution de makemigrations, vous pouvez voir une erreur de récursivité.
RecursionError: maximum recursion depth exceeded while calling a Python object
L'une des causes de l'erreur est que le nom du projet contient des caractères autres que des caractères alphanumériques demi-largeur. Cela peut se produire si le chemin contient des espaces vides. Veuillez noter que le chemin peut contenir des espaces vides si vous l'enregistrez dans un dossier spécial tel que OneDirve.
urls.py Dans urls.py directement sous le projet, définissez pour accéder à urls.py directement sous l'application.
Second\Second\urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('diary/', include('diary.urls')),
]
Entrez urls.py directement sous l'application comme suit.
Second\diary\urls.py
from django.urls import path
from . import views
app_name = 'diary'
urlpatterns = [
path('', views.index, name='index'), #Page de liste
path('add/', views.add, name='add'), #Page supplémentaire
path('update/<int:pk>/', views.update, name='update'), #Mettre à jour la page
path('delete/<int:pk>', views.delete, name='delete'), #Supprimer la page
path('detail/<int:pk>', views.detail, name='detail'), #Page de détails
]
Enregistrez l'URL dans urls.py directement sous l'application. Cette fois, nous allons créer 5 pages de liste, ajouter, mettre à jour, supprimer et détails. `` <int: pk> '' signifie la clé primaire associée à chaque article.
J'ai écrit que la clé primaire appelée id est automatiquement enregistrée lors de l'explication de models.py,
Dans Django, il est habituel d'exprimer cet identifiant avec une variable appelée pk.
Vous pouvez l'exprimer comme <int: id> '', mais disons
<int: pk> ''.
Par exemple, pour accéder à la page de détails où pk vaut 1, ce serait `` diary / detail / 1 / ''. Cela n'est pas nécessaire pour les pages de liste et les pages supplémentaires qui ne sont pas liées à un article spécifique.
forms.py Avant de créer views.py, créez un nouveau fichier appelé forms.py. Créez un fichier appelé forms.py dans le même dossier que views.py (Second \ diary) Veuillez faire le contenu comme suit.
Second\diary\forms.py
from django import forms
from .models import Day
class DayCreateForm(forms.ModelForm):
class Meta:
model = Day
fields = '__all__'
Bien entendu, lors de la création ou de la mise à jour d'un article, un champ de saisie est obligatoire dans le fichier HTML. Afin de créer le champ de saisie, il est nécessaire de configurer quelque chose appelé Formulaire dans le fichier HTML.
C'est ce forms.py qui définit le type de données transmises à ce formulaire. Cette fois, passons toutes les données de la classe Day définie dans models.py. Si vous voulez tout passer, définissez `` fields = '__ all __' ''.
Le nom de classe DayCreateForm est arbitraire, La classe Meta est une phrase fixe. Ne le changeons pas.
views.py Créez une fonction pour afficher la liste, ajouter, mettre à jour, supprimer et détailler les pages dans views.py. À l'origine, il peut être facilement écrit en utilisant la fonction divine de Django appelée vue générale basée sur les classes. Puisque cet article parle d'écrire avec une fonction, j'ose l'écrire avec une fonction.
Second\diary\views.py
from django.shortcuts import render, redirect, get_object_or_404
from .forms import DayCreateForm
from .models import Day
def index(request):
"""
Afficher une liste d'agenda
"""
context = {
'day_list':Day.objects.all(),
}
return render(request, 'diary/day_index.html', context)
def add(request):
"""
Article de journal ajouté
"""
#Créez un formulaire basé sur le contenu soumis. Si ce n'est pas POST, créez un formulaire vide.
form = DayCreateForm(request.POST or None)
# method==POST est lorsque le bouton d'envoi est enfoncé. forme.is_valid est True s'il n'y a aucun problème avec le contenu d'entrée.
if request.method == 'POST' and form.is_valid():
form.save()
return redirect('diary:index')
#S'il y a une erreur dans l'accès normal ou le contenu d'entrée, jour à nouveau_form.Afficher html
context = {
'form':form
}
return render(request, 'diary/day_form.html', context)
def update(request, pk):
"""
Article de journal modifié
"""
#Get Day en fonction de l'url pk (pk est le même que id)
day = get_object_or_404(Day, pk=pk)
#Lier le jour acquis au formulaire
form = DayCreateForm(request.POST or None, instance=day)
# method=POST(Appuyez sur le bouton d'envoi), Et s'il n'y a pas de problème avec le contenu d'entrée, enregistrez le formulaire.
if request.method == 'POST' and form.is_valid():
form.save()
return redirect('diary:index')
#Afficher la première page en cas de problème d'accès normal ou de contenu d'entrée
context = {
'form':form
}
return render(request, 'diary/day_form.html', context)
def delete(request, pk):
"""
Supprimer l'article du journal
"""
#Get Day basé sur le PK de l'URL (pk est le même que id)
day = get_object_or_404(Day, pk=pk)
# method=POST(Appuyez sur le bouton d'envoi)
if request.method == 'POST':
day.delete()
return redirect('diary:index')
#Accès normal. Ou accès en cas de problèmes.
context = {
'day':day
}
return render(request, 'diary/day_delete.html', context)
def detail(request, pk):
"""
Page de détail du journal
"""
#Get Day en fonction du PK de l'URL
day = get_object_or_404(Day, pk=pk)
context = {
'day':day
}
return render(request, 'diary/day_detail.html', context)
def index (request):
est une fonction pour afficher une liste d'articles.
Affectez toutes les données de la classe Day dans models.py au contexte.
Je passe le contexte créé à day_index.html en utilisant la fonction de rendu.
def add (request):
est une fonction pour créer un nouvel article.
Créez un formulaire basé sur le contenu soumis avec `` form = DayCreateForm (request.POST ou None) ''. S'il est dans l'état avant la soumission, ce sera un formulaire vide.
ʻIf request.method == 'POST' et form.is_valid ():
`est le processus lorsque le bouton d'envoi est pressé et il n'y a aucun problème avec le contenu.
Puisqu'il n'y a pas de problème, enregistrez-le avec form.save () et redirigez vers la page index.html.
En cas d'accès normal ou s'il y a une erreur dans l'entrée, passez le contexte à day_form.html avec la fonction render.
def update (request, pk):
est une fonction pour changer le contenu de l'article.
Lors de l'affichage de cette page de mise à jour, l'URL sera diary / update / day = get_object_or_404(Day, pk=pk)
Le traitement suivant est le même flux que la fonction d'ajout.
def delete (request, pk):
est une fonction pour supprimer un article.
C'est presque le même processus que la mise à jour, mais comme il est supprimé, il n'est pas nécessaire de faire fonctionner le formulaire, il n'est donc pas créé.
Supprimez l'article avec day.delete () et redirigez-le vers index.html.
def detail (request, pk):
est une fonction pour afficher la page de détail de l'article.
C'est simple car vous n'avez pas non plus à créer de formulaire.
Enfin, créez un fichier html. Créez un dossier de modèles sous le dossier Agenda, puis créez un dossier Agenda.
Tout d'abord, créez base.html. C'est le fichier html qui est le chef-d'œuvre de tout.
Liez la page de liste et la création d'un nouvel article dans la partie nav.
Lien avec {% url '<nom de l'application>: <valeur de nom définie dans urls.py>'%}
.
Second\diary\templates\diary\base.html
<!doctype html>
<html lang="ja">
<head>
<title>Application de l'agenda</title>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" integrity="sha384-PsH8R72JQ3SOdhVi3uxftmaW6Vc51MKb0q5P2rRUpPvrszuE4W1povHYgTpBfshb" crossorigin="anonymous">
</head>
<body>
<div class="container">
<nav class="nav">
<a class="nav-link active" href="{% url 'diary:index' %}">liste</a>
<a class="nav-link" href="{% url 'diary:add' %}">ajouter à</a>
</nav>
{% block content %}
{% endblock %}
</div>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.3/umd/popper.min.js" integrity="sha384-vFJXuSJphROIrBnz7yo7oB41mKfc8JzQZiCq4NCceLEaO4IHwicKwpJf9c9IpFgh" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/js/bootstrap.min.js" integrity="sha384-alpBpkh1PFOepccYVYDB4do5UnbKysX5WZXm3XxPqe5iKTfUKjNkCk9SaVuEZflJ" crossorigin="anonymous"></script>
</body>
</html>
C'est une page de liste d'articles.
Depuis views.py, day_list reçoit le contexte clé, donc Vous pouvez utiliser day_list pour accéder aux titres des articles et aux dates stockées dans votre base de données. Ceci est affiché à l'aide de l'instruction for.
C'est un mécanisme pour accéder à la page de mise à jour de chaque article en passant day.pk pour mettre à jour et supprimer.
Second\diary\templates\diary\day_index.html
{% extends 'diary/base.html' %}
{% block content %}
<h1>Liste de journal</h1>
<table class="table">
<thead>
<tr>
<th>Titre</th>
<th>Date</th>
<th>Processus de mise à jour</th>
<th>Supprimer le processus</th>
</tr>
</thead>
<tbody>
{% for day in day_list %}
<tr>
<td><a href="{% url 'diary:detail' day.pk %}">{{ day.title }}</a></td>
<td>{{ day.date }}</td>
<td><a href="{% url 'diary:update' day.pk %}">mise à jour</a></td>
<td><a href="{% url 'diary:delete' day.pk %}">Effacer</a></td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
Ceci est la page de détails. Le titre, le texte et la date s'affichent. Les sauts de ligne sont ajoutés après le texte Il s'agit d'exprimer des sauts de ligne sur HTML. Il n'y a pas de problème même sans cela.
Second\diary\templates\diary\day_detail.html.html
{% extends 'diary/base.html' %}
{% block content %}
<table class="table">
<tr>
<th>Titre</th>
<td>{{ day.title }}</td>
</tr>
<tr>
<th>Texte</th>
<td>{{ day.text | linebreaksbr}}</td>
</tr>
<tr>
<th>Date</th>
<td>{{ day.date }}</td>
</tr>
</table>
<a href="{% url 'diary:update' day.pk %}"><button class="btn btn-primary">mise à jour</button></a>
<a href="{% url 'diary:delete' day.pk %}"><button class="btn btn-danger">Effacer</button></a>
{% endblock %}
Créer un formulaire. Il est utilisé pour créer et mettre à jour des articles.
Second\diary\templates\diary\day_form.html
{% extends 'diary/base.html' %}
{% block content %}
<form action="" method="POST">
<table class="tabel">
<tr>
<th>Titre</th>
<td>{{ form.title }}</td>
</tr>
<tr>
<th>Texte</th>
<td>{{ form.text }}</td>
</tr>
<tr>
<th>Date</th>
<td>{{ form.date }}</td>
</tr>
</table>
<button type="submit" class="btn btn-primary">Envoyer</button>
{% csrf_token %}
</form>
{% endblock %}
Un contenu similaire continue, mais c'est la fin. Le dernier est la page de suppression.
Second\diary\templates\diary\day_delete.html
{% extends 'diary/base.html' %}
{% block content %}
<form action="" method="POST">
<table class="table">
<tr>
<th>Titre</th>
<td>{{ day.title }}</td>
</tr>
<tr>
<th>Texte</th>
<td>{{ day.text }}</td>
</tr>
<tr>
<th>Date</th>
<td>{{ day.date }}</td>
</tr>
</table>
<p>Supprimez ces données.</p>
<button type="submit" class="btn btn-primary">Effacer</button>
{% csrf_token %}
</form>
{% endblock %}
Après cela, vérifions le fonctionnement avec le serveur d'exécution py manage.py. Si vous pouvez créer / mettre à jour / supprimer un article, vous réussissez.
Recommended Posts