[PYTHON] Les débutants de Django créent des applications simples 3

introduction

Une suite de 2 où les débutants de Django créent des applications simples. La dernière fois, j'ai créé urls.py, views.py, template et créé R de CRUD, c'est-à-dire Read part. Cette fois, je veux créer la pièce Créer avec une vue basée sur les classes.

Table de série pour les débutants pour créer des applications simples

environnement

Ubuntu 20.04 LTS Python 3.8.2 Django 3.02

supposition

Le nom du projet est config et le nom de l'application est myapp. En d'autres termes, les deux commandes suivantes ont été exécutées

(myenv)$ django-admin startproject config .
(myenv)$ python manage.py startapp myapp

Le répertoire des modèles est créé dans la même hiérarchie que manage.py et setting.py a également été modifié. (Voir "Les débutants créent des applications faciles 1")

0. Conception approximative

En fait, je voulais pouvoir saisir le titre du film, le nom du réalisateur, la date de visionnage et les impressions sur un seul écran à la fois ... Il s'avère que la liaison avec ForeignKey n'est pas si simple (vous pouvez voir l'inconvénient après avoir fait ce genre de chose ...). Bien qu'il puisse être implémenté avec un "ensemble de formulaires en ligne", c'est un peu difficile pour les débutants, nous avons donc adopté une méthode d'enregistrement du nom du réalisateur, du film et de l'impression séparément. L'image est présentée ci-dessous.

08116AEF-A591-4655-A10C-14065C8E4BB8.jpeg

1. Mise en œuvre de Create

Jusqu'à présent, chaque donnée était saisie depuis le site de gestion de 127.0.0.1: 8000 / admin /, mais je voudrais créer une page pour entrer à partir du Web. C'est la partie Créer. L'ordre de fabrication est le suivant.

  1. Créez forms.py
  2. Déterminez l'adresse dans urls.py
  3. Écrivez comment saisir le nom du réalisateur et les informations sur le film dans views.py
  4. Créez un fichier HTML pour la page que vous souhaitez saisir

Ce formulaire est l'entrée pour entrer dans la base de données appelée modèle. Au contraire, cela semble être une interface qui relie le modèle et le formulaire HTML. Quand j'ai commencé à jouer avec Django, je n'avais aucune idée de ce que je faisais car je pensais que le formulaire de Django et le formulaire HTML étaient la même chose. ** La forme et la forme sont différentes. ** Je me suis toujours demandé pourquoi il y avait un formulaire, mais ** les vêtements lavés (données) ne peuvent pas être mis dans le modèle sans permission. J'ai besoin de quelqu'un qui puisse le plier correctement, et c'est form + view ** et auto-résolu.

E635ADCB-33A0-4A9A-9BFA-C7593213C02E.jpeg

Écrivez le formulaire au milieu de la figure ci-dessus dans form.py.

code dans form.py

myapp/form.py


from django.forms import ModelForm
from myapp.models import Movie, Director, Log

class DirectorForm(ModelForm):
    class Meta:
        model = Director
        fields = ('name',)

class MovieForm(ModelForm):
    class Meta:
        model = Movie
        fields = ('title','watch_date', 'director')

class LogForm(ModelForm):
    class Meta:
        model = Log
        fields = ('movie','text')

Puisqu'il existe 3 modèles, 3 formulaires sont également décrits. Il existe deux types de classes Form, «forms.Form» et «forms.ModelForm», et «ModelForm» est plus simple. Le formulaire étant l'entrée des données d'entrée, il est directement connecté au modèle. Décrivez simplement ce que modèle (base de données) utilise et quel champ (élément) utiliser sous classe Meta. Ensuite, écrivez l'adresse de la page d'entrée dans urls.py.

Code dans urls.py

myapp/urls.py


from django.urls import path, include
from myapp import views

app_name = 'myapp'
urlpatterns = [
    path('', views.IndexView.as_view(), name='index'),
    path('movie/<int:pk>/', views.MovieDetailView.as_view(), name='movie_detail'),
    path('register/director/', views.RegisterDirectorView.as_view(), name='registerdirector'), #Ajoute ça
    path('register/movie/', views.RegisterMovieView.as_view(), name='registermovie'), #Ajoute ça
    path('writing/log/', views.WritingLogView.as_view(), name='writinglog'), #Ajoute ça
]

Puis créez une vue basée sur les classes (ici RegisterDirectorView, RegisterMovieView et WritingLogView) comme spécifié dans urls.py.

Code Views.py

Commencez par afficher pour enregistrer le nom du directeur.

myapp/views.py



class RegisterDirectorView(generic.CreateView):
    model = Director
    form_class = DirectorForm
    template_name = 'myapp/register.html'
    def get_success_url(self):
        return reverse('myapp:registermovie') 

Ensuite, View pour enregistrer les informations du film.

myapp/views.py



class RegisterMovieView(generic.CreateView):
    model = Movie
    form_class = MovieForm
    template_name = 'myapp/register.html'
    def get_success_url(self):
        return reverse('myapp:movie_detail', kwargs={'pk': self.object.pk }) 

Enfin, View pour écrire l'impression du film.

myapp/views.py


class WritingLogView(generic.CreateView):
    model = Log
    form_class = LogForm
    template_name = 'myapp/register.html'
    def get_success_url(self):
        return reverse('myapp:movie_detail', kwargs={'pk': self.object.movie.pk }) 

Les quatre éléments suivants sont communs aux trois CreateViews ci-dessus.

  1. Quelle est la base de données qui stocke les données d'entrée (modèle = partie)
  2. Quel formulaire utiliser (form_class = part)
  3. Quel est le fichier HTML qui affiche l'écran de saisie (template_name = part)
  4. Si l'entrée et le stockage des données dans la base de données réussissent, quelle page doit être affichée (partie def get_success_url)

Si vous choisissez ces 4 éléments, CreateView fera automatiquement diverses choses pour vous.

Expliquez la dernière ligne des trois vues

  1. return reverse('myapp:registermovie')

RegisterDirectorView. La fonction inverse signifie sauter à l'adresse écrite entre (). Cette fois, myapp: registermovie correspond à la dernière partie de path ('register / movie /', views.RegisterMovieView.as_view (), name = 'registermovie'), décrit dans urls.py. En d'autres termes, allez à 127.0.0.1: 8000 / myapp / register / movie /.

  1. return reverse('myapp:movie_detail', kwargs={'pk': self.object.pk })

RegisterMovieView. kwargs = {'pk': self.object.pk} est un argument mot-clé et est un type de dictionnaire. Dans ma compréhension ... Les données d'entrée sont instanciées dans un objet (instance). C'est self.object. La chose a automatiquement un pk (clé primaire: un numéro d'identification qui peut être attribué arbitrairement), et que pk (self.object.pk) est lié au pk (partie clé du dictionnaire) de movie_detail. Sera fait. Utilisez-le pour accéder à la page movie_detail. En d'autres termes, si le pk de l'objet "Sonatine: Takeshi Kitano: 2020-05-01" est 1, cela signifie voler vers 127.0.0.1: 8000 / myapp / movie / 1 /.

  1. return reverse('myapp:movie_detail', kwargs={'pk': self.object.movie.pk })

WritingLogView. Partie d'argument de mot-clé. Auparavant, c'était «self.object.pk» et cette fois c'est «self.object.movie.pk». Pourquoi. Self.object de RegisterMovieView était un objet de film, mais self.object de WritingLogView est un objet d'impression. Il devient self.object.movie.pk pour extraire le pk du film associé à l'impression. Au fait, cette partie movie signifie le film décrit dans` class Log (models.Model) ʻof models.py.

Créer un fichier HTML

Créez retister.html décrit dans le code précédent (template_name = part). Créez un fichier register.html dans le répertoire templates et le répertoire myapp en dessous, et écrivez le code suivant.

templates/myapp/register.html


<form method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">save</button>
</form>

Ceci est le formulaire HTML. Écrivez {% csrf_token%} car ce n'est pas une exigence magique pour la sécurité. Le suivant {{form.as_p}} créera et affichera automatiquement le contenu du formulaire. On dit qu'un code est requis pour trois formes: l'entrée du nom du réalisateur, l'entrée des informations sur le film et la saisie des impressions. C'est incroyable. C'est vraiment intelligent.

Afficher le résultat de register.html

Entrez http: //127.0.0.1: 8000 / myapp / register / director / directement dans le navigateur pour aller à "l'écran de saisie du nom du directeur". S'il s'agit de http: //127.0.0.1: 8000 / myapp / register / movie /, allez à "l'écran de saisie des informations sur le film". S'il s'agit de http: //127.0.0.1: 8000 / myapp / writing / log /, il passera à "l'écran de saisie d'impression". Le champ directeur de «l'écran de saisie des informations sur le film» et le champ de titre de «l'écran de saisie d'impression» sont des formules de sélection déroulante (car ils sont liés par une clé étrangère).

Écran de saisie du nom du directeur Écran de saisie des informations sur le film Écran de saisie d'empreinte
Screenshot from 2020-05-20 20-09-30.png Screenshotfrom2020-05-2020-08-22.png Screenshotfrom2020-05-2020-39-27.png

Avec ce qui précède, la partie Créer a été implémentée.

Épilogue

Maintenant que nous avons atteint la moitié du CRUD, les autres sont UPDATE et DELETE. Mais la prochaine fois, je prévois de faire un détour et de réécrire le code que j'ai écrit en mode Class-based-view avec Function-view, et voir comment Django fonctionne en comparant les deux. Si vous avez des erreurs, veuillez les signaler et nous donner des conseils.

Recommended Posts

Les débutants de Django créent des applications simples 3
Les débutants de Django créent des applications simples 1
Les débutants de Django créent des applications simples 2
Les débutants de Django créent des applications simples 5
Les débutants de Django créent des applications simples 4
Créer les paramètres initiaux et les applications de personnel dans Django
Créer un planning Django
tutoriel simple django oscar
Créer une liste Django Todo
Créer une API avec Django
Créer un serveur REST (simple)
Création de liste de tâches [Python Django]
Créer une page d'accueil avec django
Shell pour créer un projet django
Créer un écran de connexion Django
Créez votre propre middleware Django
Créer un serveur textlint simple
Créer et lister des modèles Django
(Pour les débutants) Essayez de créer une API Web simple avec Django
Hello World (débutant) avec Django
Créez une API d'intégration sociale pour les applications smartphone avec Django
Les utilisateurs de Rails essaient de créer un moteur de blog simple avec Django
Étapes pour créer un projet Django
Django débutant a essayé de créer l'environnement
[Pour les débutants] Django -Construction d'environnement de développement-
Créer une nouvelle application utiliser python, django
[Django] Créez votre propre page d'erreur 403, 404, 500
Créer un téléchargeur de fichiers avec Django
Créer un bot LINE avec Django