[PYTHON] Créez une application CRUD simple en utilisant la vue de classe générique de Django

introduction

Auparavant, j'ai créé une application qui vous permet de publier, éditer et supprimer facilement avec Rails, j'ai donc essayé de la reproduire avec Django. Avec le thème «Poster les impressions du livre que vous avez lu», vous pouvez publier le titre du livre et une courte impression. La source du code est ci-dessous.

Version des rails: https://github.com/Sn16799/Bookers.git Version Django: https://github.com/Sn16799/DjangoBookers.git

environnement

OS: centos7 Django: 3.0.6 Python: 3.8.3

Lancez l'appli

$ python manage.py start project mysite
$ cd mysite
$ python manage.py startapp bookers

Structure du répertoire

Sous les modèles, forms.py a été ajouté manuellement.

mysite/
  bookers/
    templates/
      books/
        index.html
        detail.html
        update.html
    admin.py
    forms.py
    models.py
    urls.py
    views.py
  mysite/
    settings.py
    urls.py

Créer / activer un modèle

Modifiez models.py.

bookers/models.py


from django.db import models
from django.urls import reverse

# Create your models here.
class Book(models.Model):
	title = models.CharField('title', max_length=50)
	body = models.CharField('body', max_length=200)

	def get_absolute_url(self):
		return reverse('bookers:detail', kwargs={'pk': self.pk})

Je veux garder la structure aussi simple que possible, donc les seules colonnes sont le titre et le corps. En dessous, get_absolute_url est une méthode qui spécifie la destination de la transition après l'enregistrement des données dans le modèle. Quand j'ai essayé de créer des données sans écrire ceci, j'ai eu l'erreur "Veuillez définir get_absolute_url !!" (Pour la méthode, ce site archives / 402 # Post) est très détaillé et facile à comprendre).

Ajoutez ce qui suit à settings.py.

mysite/settings.py


INSTALLED_APPS = [
    'bookers.apps.BookersConfig', #Ajouter ici
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Effectuez une migration pour informer Django du changement de modèle.

$ python manage.py makemigrations bookers
$ python manage.py migration

Vous êtes maintenant prêt à développer votre application.

Créer un site administrateur

Django a un site d'administration par défaut. Ce sera pratique pour une implémentation future, alors définissons d'abord le côté administrateur.

mysite/urls.py


from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('bookers/', include('bookers.urls', namespace='django_bookers')),
    path('admin/', admin.site.urls),
]

bookers/admin.py


from django.contrib import admin
from django_bookers.models import Book

# Register your models here.
admin.site.register(Book)

Vous pouvez créer un compte administrateur en exécutant la commande suivante. Il vous sera demandé votre nom, votre adresse e-mail et votre mot de passe, alors entrez n'importe quelle valeur.

$ python manage.py createsuperuser

Accédez à http://127.0.0.1:8000/admin/ et vous verrez le site d'administration. Si vous vous connectez avec les informations utilisateur que vous avez créées précédemment, vous pouvez ajouter et gérer des enregistrements pour chaque application. Nous vous recommandons de faire quelques enregistrements à ce stade.

Paramètres d'URL

Tout d'abord, définissez l'URL.

bookers/urls.py


from django.urls import path
from . import views

app_name='bookers'
urlpatterns = [
    # bookers/
    path('', views.CreateView.as_view(), name='index'),
    # bookers/1/
    path('<int:pk>/', views.DetailView.as_view(), name='detail'),
    # bookers/1/update/
    path('<int:pk>/update/', views.UpdateView.as_view(), name='update'),
    # bookers/1/delete/
    path('<int:pk>/delete', views.delete, name='delete'),
]

Écrivez facilement le fichier modèle. Je vais le réparer plus tard, donc ce n'est pas grave si vous écrivez les caractères qui vous indiquent ce qu'est l'écran.

templates/books/index.html


<h1>this is INDEX view !!!</h1>

templates/books/update.html


<h1>this is UPDATE view !!!</h1>

templates/books/detail.html


<h1>this is DETAIL view !!!</h1>

Voir l'implémentation

Modifiez views.py comme suit.

bookers/views.py


from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect
from django.views import generic
from .models import Book
from .forms import BookForm

class CreateView(generic.CreateView):
	model = Book
	form_class = BookForm
	template_name = 'books/index.html'

	#Obtenez toutes les données du modèle de livre, réservez_Stocker dans la liste
	def get_context_data(self):
		context = super().get_context_data()
		context['book_list'] = Book.objects.all()
		return context

class DetailView(generic.DetailView):
	model = Book
	template_name = 'books/detail.html'
	context_object_name = 'book'

class UpdateView(generic.UpdateView):
	model = Book
	template_name = 'books/update.html'
	form_class = BookForm

def delete(request, pk):
	book = get_object_or_404(Book, id=pk)
	book.delete()
	return redirect('bookers:index')

Après avoir enregistré le contenu, vérifiez si chaque écran s'affiche correctement. Écran de liste (index.html): http://127.0.0.1:8000/bookers Écran d'édition (update.html): http://127.0.0.1:8000/bookers/1/update Écran de détail (detail.html): http://127.0.0.1:8000/bookers/1/detail

Exemple) Écran de liste index.jpg

Si les caractères que vous avez écrits dans le fichier html sont affichés, les paramètres de routage sont terminés.

Fonction de publication

Je veux afficher la liste des articles et des nouveaux articles sur le même écran, je vais donc créer une fonction avec CreateView. ListView est également préparé pour l'affichage de la liste, mais je l'ai arrêté car il semblait compliqué d'implémenter de nouveaux messages. Il semble que django.views.generic a beaucoup d'autres vues générales utiles.

python:bookers.views.py



class CreateView(generic.CreateView):
        model = Book
        form_class = Bookform
        template_name = 'books/index.html'

	def get_context_data(self):
		context = super().get_context_data()
		context['book_list'] = Book.objects.all()
		return context

Dans CreateView, vous pouvez transmettre toutes les données avec la méthode get_context_data. Ici, afin de lister les articles, nous obtenons toutes les données du modèle Book avec le nom book_list. Pour les arguments et méthodes qui peuvent être utilisés dans la vue de classe, cliquez ici (https://btj0.com/blog/django/method-attribute/).

bookers/templates/books/index.html


<h1>Books</h1>

<table>
  <thead>
	<tr>
  	  <th>Title</th>
	  <th>Body</th>
	</tr>
  </thead>
  <tbody>
	{% for book in book_list %}
	<tr>
	  <td>{{ book.title }}</td>
	  <td>{{ book.body }}</td>
	  <td>
		<a href="{% url 'bookers:detail' book.id %}">Detail</a>
		<a href="{% url 'bookers:update' book.id %}">Update</a>
		<a href="{% url 'bookers:delete' book.id %}">Delete</a>
	  </td>
	</tr>
	{% endfor %}
  </tbody>
</table>

<h2>New Book</h2>
<form method="post">
  {{ form.as_p }}
  {% csrf_token %}
  <input type="submit" name="Submit">
</form>

Si vous allez sur http://127.0.0.1:8000/bookers/ et que vous voyez l'en-tête "Livres" et l'écran du formulaire de publication, vous êtes prêt à partir. À ce stade, si vous remplissez le formulaire et appuyez sur le bouton Soumettre, vous serez redirigé vers l'écran des détails et vous verrez "ceci est la vue DETAIL !!!" (la formulation appropriée que vous avez entrée plus tôt). Cependant, soyez assuré que si vous revenez à la liste, les messages enregistrés s'afficheront correctement.

index.jpg ↑ Écran de liste qui est terriblement trouble car l'écran n'est pas décoré

Page de détails

Il s'agit d'un écran détaillé qui vous permet d'extraire et d'afficher un seul article, qui transite lorsque vous cliquez sur le lien «Détails» sur l'écran de liste. Dans cette application, les colonnes ne sont que le titre et le texte, et vous pouvez tous les voir dans la liste, donc ce n'est pas pratique, mais je vais le faire pour la pratique.

bookers/views.py


class DetailView(generic.DetailView):
	model = Book
	template_name = 'books/detail.html'
	context_object_name = 'book'

Puisque nous avons spécifié book dans context_object_name, nous pouvons maintenant appeler les données avec le nom book dans le modèle. Pour une raison quelconque, j'ai pu afficher le contenu de la colonne même si j'ai écrit objet, mais j'ai spécifié le livre pour une compréhension facile.

bookers/templates/books/detail.html


<p>
  <strong>Title:</strong>
  {{ book.title }}
</p>

<p>
  <strong>Body:</strong>
  {{ book.body }}
</p>

<a href="{% url 'bookers:update' book.id %}">Update</a>
 |
<a href="{% url 'bookers:index' %}">Back</a>

Allons à http://127.0.0.1:8000/bookers/1/detail. detail.jpg ↑ Puisque rien n'est trop, j'ai également mis un lien vers l'écran d'édition (Update) et l'écran de liste (Back).

Fonction d'édition

Vous permet de modifier les données publiées ultérieurement.

bookers/views.py


class UpdateView(generic.UpdateView):
	model = Book
	template_name = 'books/update.html'
	form_class = BookForm

bookers/templtes/books/update.html


<h1>Updating Book</h1>

<form method="post">
  {{ form.as_p }}
  <button type="submit">Update</button>
</form>

<a href="{% url 'bookers:detail' book.id %}">Detail</a>
 | 
<a href="{% url 'bookers:index' %}">Back</a>

(Comme il s'agit d'un processus de mise à jour, la méthode du formulaire est patch! J'étais confiant d'avoir écrit le patch et j'en suis tombé amoureux. Le bon sens de Rails est fou de Django.)

Si vous visitez http://127.0.0.1:8000/bookers/1/update, vous verrez un formulaire avec des données.

update.jpg

Je n'avais pas l'intention de donner un exemple, mais le titre du livre que j'ai publié était incorrect et j'aimerais le corriger. Corrigez certaines pièces et appuyez sur le bouton "Mettre à jour".

detail_after_update.jpg Redirigé vers l'écran des détails et corrigé le titre correct!

Supprimer la fonction

bookers/views.py


def delete(request, pk):
	book = get_object_or_404(Book, id=pk)
	book.delete()
	return redirect('bookers:index')

Si vous appuyez sur le bouton de suppression sur l'écran de liste, vous serez redirigé vers le même écran. Puisque l'écran de confirmation de suppression n'a pas été créé cette fois, la définition de la vue est différente des autres fonctions et commence par def (vue générale basée sur la fonction).

* À propos des types de vues

Les vues créées avec views.py sont grossièrement divisées en ** vues génériques basées sur les classes ** qui commencent par des vues génériques basées sur des classes et ** des vues génériques basées sur des fonctions ** qui commencent par def. Comme il existe trois types d'écrans à créer cette fois, nous les avons implémentés dans des vues à usage général basées sur les classes uniquement pour la création, le détail et la mise à jour. Avec cette fonctionnalité, vous pouvez créer un écran qui inclut des fonctionnalités CRUD et des formulaires avec moins de code. Cependant, comme vous ne pouvez pas créer une vue sans modèle, seule la suppression est une vue à usage général basée sur une fonction. (Pour plus de détails, cliquez ici](https://qiita.com/dai-takahashi/items/7d0187485cad4418c073))

Épilogue

J'étais accro aux erreurs ici et là, mais j'ai réussi à créer une application avec le minimum de fonctionnalités. Cette fois, je n'ai pas fait le message Flash lorsque la publication / la mise à jour / la suppression a réussi, et la décoration avec CSS, je voudrais donc l'implémenter plus tard.

référence

Comment créer une application en général

Création de votre première application Django (documentation Django)

Comment créer une fonction de suppression non basée sur une classe: DjangoBrothers

À propos des vues génériques basées sur les classes

Introduction aux vues générales basées sur les classes dans Django et exemples d'utilisation Collecte des vues de classe génériques de Django et mention de l'implémentation

Liste des vues génériques basées sur les classes: Code for Django

Une collection d'arguments et de méthodes qui peuvent être utilisées dans des vues à usage général basées sur les classes: Boutique d'antennes de Ganesha

Autre

Utilisez correctement success_url et get_success_url, reverse et reverse_lazy: Boutique d'antennes de Ganesha

À propos de get_absolute_url (méthode utilisée pour le modèle): Laboratoire d'ingénieur informatique

Recommended Posts

Créez une application CRUD simple en utilisant la vue de classe générique de Django
Créez une application de gestion de partition shogi à l'aide de Django 4 ~ Créer une vue ~
Créer une API CRUD à l'aide de l'API rapide
Créer une application GUI simple en Python
Créez une application Web simple avec Flask
Ajax dans Django (en utilisant la vue de classe générique)
Créer une application d'assistance technique à l'aide de PyLearn2
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 1 ~
Remarque DJango: depuis le début (en utilisant une vue générique)
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 2 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 3 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 4 ~
[CRUD] [Django] Créer un site CRUD en utilisant le framework Python Django ~ 5 ~
Créer un serveur REST (simple)
Créer un serveur textlint simple
Créez une application de gestion de score shogi à l'aide de Django 2 ~ Paramètres de la base de données ~
Créez une application de gestion de partition shogi à l'aide de Django 6 ~ Split Template ~
Création et déploiement d'applications Django (PTVS) à l'aide du stockage Azure Table
Créez un lot planifié simple à l'aide de l'image Python de Docker et de parse-crontab
Créer une interface graphique python à l'aide de tkinter
Créer un dictionnaire imbriqué à l'aide de defaultdict
Créer un tableau simple à l'aide de prettytable
Créez un wrapper de langage C à l'aide de Boost.Python
Créez une application de gestion de score shogi à l'aide de Django 3 ~ Paramètres du site de gestion par défaut de Django ~
Créer un décorateur de fonction Python avec Class
Créer un graphique à l'aide du module Sympy
Créer une application graphique avec Tkinter de Python
[Python] Créer un environnement Batch à l'aide d'AWS-CDK
Créer une application Python-GUI dans Docker (PySimpleGUI)
Créer un bloc de données à partir d'Excel à l'aide de pandas
Créez une application Web qui convertit le PDF en texte à l'aide de Flask et PyPDF2