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.
Ubuntu 20.04 LTS Python 3.8.2 Django 3.02
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")
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.
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.
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.
Écrivez le formulaire au milieu de la figure ci-dessus 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.
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.
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.
Si vous choisissez ces 4 éléments, CreateView fera automatiquement diverses choses pour vous.
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 /
.
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 /
.
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é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.
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 |
---|---|---|
Avec ce qui précède, la partie Créer a été implémentée.
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