[PYTHON] Django Hands On

Django Hands On

environnement

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.

Créer une application Todo

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.

Créer un modèle

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.

Création d'un modèle de vue de routage

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.

Créer une vue

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``.

Créer un modèle

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>

Paramètres de routage

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.

rooting.png

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.

no-task.png

Implémentation de Create

Suivez la même procédure pour implémenter CRUD CREATE.

Vue

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 ''.

modèle

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%}.

routage

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.

task-create.png

Enregistrons-en quelques-uns comme essai.

Créer un écran de détail

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.

Implémentation de la fonction de mise à jour

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>

Ajout de la fonction de suppression

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>

en conclusion

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

Django Hands On
Django
mise à jour de Django
Django Note 4
recherche django
Installation de Django
Résumé de Django
Test Django
Django # 2 (modèle)
Django Note 5
Touchez django
Mémo Django
Résumé de Django
Les bases de Django
Django Shoho
Paramètres initiaux de Django
Django + Docker
Glossaire Django
Installation de Django
Django: Références
Django Note 1
Django Note 3
Django Note 2
Démarrage de Django
Mémo Django
Django NullCharField
Construction de l'environnement Django
Django Heroku Deploy 1
Modèle HTML Django partie 2
Formulaire de demande Django 2
Django a commencé la partie 1
Modèle Django: ManyToManyField
Modèle dans Django
Vue basée sur les fonctions Django
Tutoriel Python Django (5)
Mémo d'apprentissage Django
Tutoriel Python Django (2)
Notes de [Django] as_view ()
Premier défi Django
django makemigarations créeuperutilisateur
Sites liés à Django
Internationalisation avec Django
Vérification de la version de Django
création de table django
CentOS8 --Jouer --Django
mémo du didacticiel django
[Django] Refaire la migration
construction d'environnement django
Tutoriel Python Django (8)
Tutoriel Python Django (6)
Configuration initiale de django
Démarrer le didacticiel Django 1
Modèle HTML Django
Astuces pour les modèles Django
Flux de travail Django Girls-3
Référence du projet Django
Django Heroku Deploy 2
CRUD avec Django
Vue basée sur les classes Django