OS: Ubuntu 18.04 Python: 3.6.8 Django: 2.2.5 -> 2.2.8
Nous en ajouterons plus sur Windows plus tard. Je n'ai pas de Mac, mais c'est probablement le même que Linux (?). Ajoutez si possible.
Reportez-vous à l'article Dernière fois, et il est supposé que la structure des répertoires est la suivante. Si vous ne l'avez pas encore défini, créez d'abord l'environnement.
Nous allons créer une application à partir d'ici.
Tapez `` django-admin startapp mytodo '' sur la console.
Vous pouvez également utiliser python manage.py startapp mytodo
.
Après création, le répertoire + fichier de l'application mytodo
sera créé comme indiqué ci-dessous.
.
|-- config
| |-- __init__.py
| |-- __pycache__
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
|-- db.sqlite3
|-- manage.py
|-- myenv
| |-- bin
| |-- include
| `-- lib
`-- mytodo
|-- __init__.py
|-- admin.py
|-- apps.py
|-- migrations
|-- models.py
|-- tests.py
`-- views.py
Définissez d'abord le fuseau horaire et la langue de Django.
settings.py
#Défaut'EN-en'
LANGUAGE_CODE = 'ja'
#Défaut'UTC'
TIME_ZONE = 'Asia/Tokyo'
Actuellement, l'application Todo créée est inconnue de Django. Pour que Django reconnaisse l'application, il est nécessaire d'ajouter l'application créée aux paramètres dans `` config / settings.py ''.
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mytodo', #ajouter à
]
Cela termine l'enregistrement de l'application, et enfin nous allons créer l'application.
Pour Todo, il est plus pratique d'inclure la date de création et la date de fin, mais cette fois ce sera beaucoup plus facile. Le modèle défini cette fois est le suivant.
models.py
from django.db import models
class Task(models.Model):
doing = 0
done = 1
TASK_STATUS_CHOICES = [
(doing,'en cours'),
(done,'Terminé'),
]
title = models.CharField(max_length=50)
body = models.models.TextField()
status =models.IntegerField(default=0,choices=TASK_STATUS_CHOICES)
Après avoir codé le modèle, exécutez python manage.py make migrations
sur la console à une certaine hiérarchie dans manage.py.
Cette commande crée les fichiers nécessaires pour créer une base de données à partir du modèle.
S'il est créé sans aucune erreur, il sera affiché comme ci-dessous.
(myenv)~/Projects/python/django_handson$ python manage.py makemigrations
Migrations for 'mytodo':
mytodo/migrations/0001_initial.py
- Create model Task
À ce stade, aucune modification n'est apportée à la base de données. En passant la commande suivante python manage.py migrate
, le fichier de migration précédent sera exécuté pour la base de données.
(myenv)~/Projects/python/django_handson$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, mytodo, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying auth.0010_alter_group_name_max_length... OK
Applying auth.0011_update_proxy_permissions... OK
Applying mytodo.0001_initial... OK
Applying sessions.0001_initial... OK
En plus de TODO, le mot utilisateur est affiché. En passant, le modèle User fourni par Djnago par défaut est reflété dans la base de données.
Si vous pouvez le faire, la création du modèle est terminée.
Nous implémenterons CRUD sur la base du modèle créé précédemment. Lorsque je développe par moi-même, j'écris dans l'ordre de vue → modèle → routage, mais je pense qu'il y a des différences individuelles, donc si vous vous y habituez, écrivez dans votre propre ordre.
Tout d'abord, créez une page qui affiche tous les Todo dans une liste. Lors de l'affichage d'un modèle dans une colonne, l'utilisation de la vue basée sur les classes de Django est beaucoup plus facile car la quantité de code est considérablement réduite.
Le rôle de la vue est d'obtenir les données de la base de données à partir de la demande reçue et de les renvoyer en tant que réponse intégrée dans le modèle.
Il existe deux manières d'écrire une vue: une vue basée sur une fonction et une vue basée sur une classe. Quoi qu'il en soit, mais cette fois, je vais écrire en vue basée sur les classes.
Les vues basées sur les classes incluent ListView, DetailView, pour référence. CreateView, UpdateView, DeleteView, etc. sont fournis pour la mise à jour. En les utilisant, il est possible de préparer une vue en un instant pour un traitement simple.
Cette fois, je vais créer une liste, mais la description nécessaire est la suivante.
mytodo/views.py
from django.views.generic import ListView
from mytodo.models import Task
class TaskListView(ListView):
model = Task
template = 'mytodo/list.html'
Pour modèle '', spécifiez le modèle que vous souhaitez afficher. Importez et utilisez le modèle que vous venez de créer. Le modèle est un fichier avec des instructions de contrôle python intégrées dans HTML et a une extension de
.html``.
Traduit en japonais, il est appelé modèle ou type, mais il s'agit d'un type pour incorporer des valeurs que la vue extrait de DB. L'intégration des valeurs obtenues à partir du modèle et de la base de données dans la vue est appelée rendu. Dans la vue, Django crache un fichier html avec des données intégrées en fonction des contrôles écrits dans le fichier modèle.
{{}}
Est utilisé pour afficher des données, et {%%}
est utilisé pour incorporer des contrôles de type Python.
Tout d'abord, décrivez l'emplacement du dossier de modèles dans settings.py comme suit.
config/settings.py
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], #Changement
'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',
],
},
},
]
Créez un dossier de modèles dans la même hiérarchie que manage.py
, et créez un dossier appelé mytodo dedans.
Créez-y un fichier appelé list.html. Cette fois, nous ne couvrirons pas du tout l'apparence, alors créez un fichier html approprié
templates/mytodo/list.html
<h1>liste</h1>
<ul>
{% for task in object_list %}
<li><a href="#">{{ task.title }}</a> {{ task.get_status_display }}</li>
{% endfor %}
</ul>
Définissez les paramètres pour appeler la vue appropriée à partir de l'URL de la demande. Défini dans le fichier urls.py.
Vous pouvez tout écrire dans urls.py dans le dossier config '', mais lorsque vous créez plusieurs applications, cela débordera avec beaucoup de code et cela nuira considérablement à la maintenabilité. Cela nuit également à la portabilité de l'application. Par conséquent, il est courant de créer urls.py dans l'application
mytodo '' et de l'inclure du côté `` config ''.
Tout d'abord, créez `` mytodo / urls.py '' et modifiez-le.
urls.py
from django.urls import path
from .views import TaskListView
app_name = 'mytodo'
urlpatterns = [
path('',TaskListView.as_view(), name='task-list'),
]
Dans urls.py, mappez l'URL demandée à la vue. Ajoutez ceci du côté de la configuration.
config/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('mytodo/', include('mytodo.urls',namespace='mytodo')),#ajouter à
]
La fonction path
peut enregistrer la chaîne de caractères à enregistrer après le '/' de l'url dans le premier argument, et view et autres URLConf dans le second argument.
Le routage est complété par la création jusqu'à ce point. Vérifions immédiatement Démarrez le serveur avec `` python manage.py runserver '' et vérifiez-le.
La page introuvable s'affiche car rien n'est acheminé vers l'itinéraire. La liste des URL enregistrées s'affiche un peu ci-dessous.
Ajoutez mytodo à l'url et accédez-y en tant que http: //127.0.0.1: 8000 / mytodo
.
Actuellement, aucune donnée n'est enregistrée, donc seul l'en-tête est affiché. C'est d'un blanc pur.
Suivez la même procédure pour implémenter CRUD CREATE.
Create sera également implémenté en utilisant une vue basée sur les classes. Je l'ajouterai plus tôt à views.py.
mytodo/views.py
import django.views.generic import ListView,CreateView #Postscript
(Omission)
class TaskCreateView(CreateView):
model = Task
fields = '__all__'
initial = {'status':0}
template_name = 'mytodo/create.html'
success_url = reverse_lazy('mytodo:task-list')
La méthode d'implémentation consiste à enregistrer le modèle et le modèle de la même manière que ListView.
initial peut définir l'état initial du champ Choix du modèle Tâche ''. Pour les champs, vous pouvez spécifier les données à recevoir côté serveur. Cette fois, nous sommes censés recevoir toutes les données, mais il est également possible de ne recevoir que le
titre '' dans le modèle `` Tâche ''.
Ensuite, créez un modèle.
templates/mytodo/create.html
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="enregistrement">
</form>
Dans `` {{form.as_p}} '', le html du formulaire correspondant au modèle et aux champs de CreateView est généré. L'application de css au formulaire généré nécessite une certaine ingéniosité, mais cette fois, profitons de l'aspect unique du html avec un goût.
Ne vous inquiétez pas pour {% csrf_token%}
.
Enregistrez la vue dans urls.py.
mytodo/urls.py
from django.urls import path
from .views import TaskListView, TaskCreateView #Postscript
app_name = 'mytodo'
urlpatterns = [
path('',TaskListView.as_view(), name='task-list'),
path('create',TaskCreateView.as_view(), name='task-create'),#Postscript
]
Le dernier nom '' dans la fonction de chemin peut être nommé url. Il peut être utilisé comme argument pour des fonctions telles que
reverse_lazy '' qui est apparue dans views.py plus tôt.
Ceci termine l'implémentation de Create. Démarrez le serveur et accédez à cette URL http://127.0.0.1:8000/mytodo/create. Si vous voyez une forme savoureuse comme celle ci-dessous, vous réussissez.
Enregistrons-en quelques-uns comme essai.
Les autres sont UPDATE et DELETE de CRUD, mais créez d'abord DetailView. Actuellement, seule la liste des tâches (vue liste), mais nous allons créer une page (vue détaillée) qui affiche des informations plus détaillées sur les tâches.
Créez à partir de la vue comme avant. La mise en œuvre est très simple comme ci-dessous
mytodo/views.py
from django.views.generic import ListView,CreateView,DetailView
(Omission)
class TaskDetailView(DetailView):
model = Task
template_name = 'mytodo/detail.html'
La mise en œuvre du modèle est la suivante. De la même manière, créez un fichier appelé detail.html dans le dossier templates / mytodo.
templates/mytodo/detail.html
<h1>Détails</h1>
<div>Titre:{{object.title}}</div>
<div>status:{{object.get_status_display}}</div>
<div>Contenu:{{object.body}}</div>
<p><a href="#">Éditer</a></p>
Enfin, enregistrez l'URL.
Chemin ('detail', TaskDetailView.as_view (), name = 'task-detail') dans la liste des `ʻurl patterns
] `` Ajoutez.
Ceci termine l'implémentation de DetailView.
Implémentez la transition de la page de liste vers le DetailView. Modifiez le lien d'une balise dans list.html.
templates/mytodo/detail.html
<h1>Détails</h1>
<div>Titre:{{object.title}}</div>
<div>status:{{object.get_status_display}}</div>
<div>Contenu:{{object.body}}</div>
<p><a href="{% url 'mytodo:task-update' object.pk%}">Éditer</a></p> #Changement
Vous pouvez obtenir la clé primaire de l'objet transmise au modèle avec object.pk.
Cela sera également implémenté à partir de View.
mytodo/views.py
from django.views.generic import ListView,CreateView,DetailView, UpdateView
from django.urls import reverse_lazy
from mytodo.models import Task
(Omission)
class TaskUpdateView(UpdateView):
model = Task
fields = '__all__'
template_name = 'mytodo/update.html'
success_url = reverse_lazy('mytodo:task-list')
C'est presque la même chose que CreateView. Si vous souhaitez limiter les champs qui autorisent les mises à jour, vous pouvez jouer avec les champs.
Comme c'est presque le même travail, nous allons implémenter le routage et les modèles à la fois.
Le modèle est exactement le même que Créer.
templates/mytodo/update.html
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="enregistrement">
</form>
Ajoutez une nouvelle UpdateView au routage. Comme pour les détails, la clé primaire détermine quelles données doivent être mises à jour. ..
mytodo/urls.py
urlpatterns = [
path('',TaskListView.as_view(), name='task-list'),
path('detail/<int:pk>/',TaskDetailView.as_view(), name='task-detail'),
path('create/', TaskCreateView.as_view(), name='task-create'),
path('update/<int:pk>/', TaskUpdateView.as_view(), name='task-update'), #ajouter à
]
Nous apporterons quelques modifications afin que la transition vers cet écran d'édition puisse être effectuée à partir de l'écran des détails.
templates/mytodo/detail.html
<h1>Détails</h1>
<div>Titre:{{object.title}}</div>
<div>status:{{object.get_status_display}}</div>
<div>Contenu:{{object.body}}</div>
<p><a href="{% url 'mytodo:task-update' object.pk%}">Éditer</a></p>
C'est finalement la fin. Implémentez une vue de suppression. Comme dans l'exemple, nous allons l'implémenter à partir de la vue.
Voir la mise en œuvre.
mytodo/views.py
from django.views.generic import ListView,CreateView,DetailView, UpdateView
from django.urls import reverse_lazy
from mytodo.models import Task
(Omission)
class TaskDeleteView(DeleteView):
model = Task
template_name = 'mytodo/delete.html'
success_url = reverse_lazy('mytodo:task-list')
Implémentation du modèle. C'est très simple car vous pouvez retarder sa suppression.
templates/mytodo/delete.html
<form action="" method="post">
{% csrf_token %}
<p>Voulez-vous vraiment supprimer cela?</p>
<p><input type="submit" value="Yes"></p>
<p><a href="{% url 'mytodo:task-list' %}">Revenir</a></p>
</form>
Mise en place du routage. Le type final est le suivant.
mytodo/urls.py
from django.urls import path
from .views import TaskListView, TaskCreateView, TaskDetailView, TaskUpdateView, TaskDeleteView
app_name = 'mytodo'
urlpatterns = [
path('',TaskListView.as_view(), name='task-list'),
path('detail/<int:pk>/',TaskDetailView.as_view(), name='task-detail'),
path('create/', TaskCreateView.as_view(), name='task-create'),
path('update/<int:pk>/', TaskUpdateView.as_view(), name='task-update'),
path('delete/<int:pk>/', TaskDeleteView.as_view(), name='task-delete'), #ajouter à
]
Enfin, j'ai ajouté l'url qui transite vers cette vue supprimée. Au fait, je suis désolé de traiter list.html en utilisant l'instruction de contrôle du modèle.
templates/mytodo/list.html
<h1>liste</h1>
<a href="create/"><p>Nouvel ajout</p></a>
<ul>
{% for task in object_list %}
{% if task.status != 0 %}
<li><del><a href="detail/{{ task.id }}">{{ task.title }}</a> </del>{{ task.get_status_display }} <a href="{% url 'mytodo:task-delete' task.pk %}">Effacer</a></li>
{% else %}
<li><a href="detail/{{ task.id }}">{{ task.title }}</a> {{ task.get_status_display }} <a href="{% url 'mytodo:task-delete' task.pk %}">Effacer</a></li>
{% endif %}
{% empty %}
<li>No tasks</li>
{% endfor %}
</ul>
Merci de rester avec nous jusqu'à la fin de l'article sur l'utilisation de Django amateur. Si vous avez des erreurs, n'hésitez pas à attendre.
Recommended Posts