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
OS: centos7 Django: 3.0.6 Python: 3.8.3
$ python manage.py start project mysite
$ cd mysite
$ python manage.py startapp bookers
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
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.
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.
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>
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
Si les caractères que vous avez écrits dans le fichier html sont affichés, les paramètres de routage sont terminés.
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.
↑ Écran de liste qui est terriblement trouble car l'écran n'est pas décoré
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. ↑ Puisque rien n'est trop, j'ai également mis un lien vers l'écran d'édition (Update) et l'écran de liste (Back).
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.
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".
Redirigé vers l'écran des détails et corrigé le titre correct!
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).
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))
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.
Création de votre première application Django (documentation Django)
Comment créer une fonction de suppression non basée sur une classe: DjangoBrothers
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
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