[PYTHON] Erstellen Sie eine einfache CRUD-App mit der generischen Klassenansicht von Django

Einführung

Zuvor habe ich eine App erstellt, mit der Sie problemlos mit Rails posten, bearbeiten und löschen können. Deshalb habe ich versucht, sie mit Django zu reproduzieren. Unter dem Motto "Impressionen des von Ihnen gelesenen Buches veröffentlichen" können Sie den Titel des Buches und kurze Impressionen veröffentlichen. Die Codequelle ist unten.

Schienenversion: https://github.com/Sn16799/Bookers.git Django-Version: https://github.com/Sn16799/DjangoBookers.git

Umgebung

OS: centos7 Django: 3.0.6 Python: 3.8.3

Starten Sie die App

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

Verzeichnisaufbau

Unter den Vorlagen wurde forms.py manuell hinzugefügt.

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

Modell erstellen / aktivieren

Bearbeiten Sie 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})

Ich möchte die Struktur so einfach wie möglich halten, daher sind die einzigen Spalten Titel und Text. Darunter ist get_absolute_url eine Methode, die das Übergangsziel nach dem Speichern von Daten im Modell angibt. Als ich versuchte, Daten zu erstellen, ohne dies zu schreiben, wurde der Fehler "Bitte definiere get_absolute_url !!" angezeigt. (Für die Methode diese Site archives / 402 # Post) ist sehr detailliert und leicht zu verstehen).

Fügen Sie der Datei settings.py Folgendes hinzu.

mysite/settings.py


INSTALLED_APPS = [
    'bookers.apps.BookersConfig', #Hier hinzufügen
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

Führen Sie eine Migration durch, um Django über die Modelländerung zu informieren.

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

Jetzt können Sie Ihre App entwickeln.

Erstellen Sie eine Administrator-Site

Django hat standardmäßig eine Admin-Site. Dies ist für die zukünftige Implementierung praktisch. Legen Sie also zuerst die Administratorseite fest.

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)

Sie können ein Administratorkonto erstellen, indem Sie den folgenden Befehl ausführen. Sie werden nach Ihrem Namen, Ihrer E-Mail-Adresse und Ihrem Passwort gefragt. Geben Sie also einen beliebigen Wert ein.

$ python manage.py createsuperuser

Gehen Sie zu http://127.0.0.1:8000/admin/ und Sie sehen die Admin-Site. Wenn Sie sich mit den zuvor erstellten Benutzerinformationen anmelden, können Sie Datensätze für jede App hinzufügen und verwalten. Wir empfehlen, dass Sie zu diesem Zeitpunkt einige Aufzeichnungen machen.

URL-Einstellungen

Stellen Sie zuerst die URL ein.

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'),
]

Schreiben Sie die Vorlagendatei einfach. Ich werde es später beheben, also ist es in Ordnung, wenn Sie die Zeichen schreiben, die Ihnen sagen, was der Bildschirm ist.

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>

Implementierung anzeigen

Bearbeiten Sie views.py wie folgt.

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'

	#Holen Sie sich alle Buchmodelldaten, buchen_In Liste speichern
	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')

Überprüfen Sie nach dem Speichern des Inhalts, ob jeder Bildschirm korrekt angezeigt wird. Listenbildschirm (index.html): http://127.0.0.1:8000/bookers Bildschirm bearbeiten (update.html): http://127.0.0.1:8000/bookers/1/update Detailbildschirm (detail.html): http://127.0.0.1:8000/bookers/1/detail

Beispiel) Listenbildschirm index.jpg

Wenn die Zeichen angezeigt werden, die Sie in die HTML-Datei geschrieben haben, sind die Routing-Einstellungen abgeschlossen.

Buchungsfunktion

Ich möchte die Liste der Beiträge und neuen Beiträge auf demselben Bildschirm anzeigen, daher erstelle ich eine Funktion mit CreateView. ListView ist auch für die Listenanzeige vorbereitet, aber ich habe es gestoppt, weil es kompliziert zu sein schien, neue Beiträge zu implementieren. Es scheint, dass django.views.generic [viele andere nützliche Allzweckansichten] hat (https://codor.co.jp/django/generic-class-based-view-number).

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

In CreateView können Sie beliebige Daten mit der Methode get_context_data übergeben. Um die Beiträge aufzulisten, erhalten wir hier alle Daten des Buchmodells mit dem Namen book_list. Klicken Sie hier, um die Argumente und Methoden anzuzeigen, die in der Klassenansicht verwendet werden können (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>

Wenn Sie zu http://127.0.0.1:8000/bookers/ gehen und die Überschrift "Bücher" und den Bildschirm "Postformular" sehen, sind Sie erfolgreich. Wenn Sie zu diesem Zeitpunkt das Formular ausfüllen und auf die Schaltfläche "Senden" klicken, werden Sie zum Detailbildschirm weitergeleitet und sehen "Dies ist die Detailansicht !!!" (den entsprechenden Wortlaut, den Sie zuvor eingegeben haben). Bitte seien Sie jedoch versichert, dass die gespeicherten Beiträge ordnungsgemäß angezeigt werden, wenn Sie zur Liste zurückkehren.

index.jpg ↑ Listenbildschirm, der furchtbar trübe ist, weil der Bildschirm nicht dekoriert ist

Detailseite

Dies ist ein detaillierter Bildschirm, auf dem Sie nur einen Beitrag extrahieren und anzeigen können. Dieser ändert sich, wenn Sie auf dem Listenbildschirm auf den Link "Detail" klicken. In dieser App sind die Spalten nur der Titel und der Text, und Sie können alle in der Liste sehen, so dass es nicht bequem ist, aber ich werde es zum Üben machen.

bookers/views.py


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

Da wir book in context_object_name angegeben haben, können wir jetzt die Daten mit dem Namensbuch in der Vorlage aufrufen. Aus irgendeinem Grund konnte ich den Inhalt der Spalte auch dann anzeigen, wenn ich ein Objekt geschrieben habe, aber ich habe das Buch zum leichteren Verständnis angegeben.

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>

Besuchen wir http://127.0.0.1:8000/bookers/1/detail. detail.jpg ↑ Da nichts zu viel ist, habe ich auch einen Link zum Bearbeitungsbildschirm (Update) und Listenbildschirm (Zurück) eingefügt.

Bearbeitungsfunktion

Ermöglicht das spätere Bearbeiten der veröffentlichten Daten.

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>

(Da es sich um einen Aktualisierungsprozess handelt, ist die Methode des Formulars Patch! Ich war zuversichtlich, dass ich Patch geschrieben habe, und habe mich in ihn verliebt. Rails gesunder Menschenverstand ist Djangos Wahnsinn.)

Wenn Sie http://127.0.0.1:8000/bookers/1/update besuchen, wird ein Formular mit Daten angezeigt.

update.jpg

Ich wollte kein Beispiel liefern, aber der Titel des von mir veröffentlichten Buches war falsch und ich möchte es korrigieren. Korrigieren Sie einige Teile und klicken Sie auf die Schaltfläche "Aktualisieren".

detail_after_update.jpg Zum Detailbildschirm umgeleitet und den richtigen Titel korrigiert!

Funktion löschen

bookers/views.py


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

Wenn Sie auf dem Listenbildschirm auf die Schaltfläche Löschen klicken, werden Sie zum selben Bildschirm weitergeleitet. Da der Löschbestätigungsbildschirm diesmal nicht erstellt wurde, unterscheidet sich die Ansichtsdefinition von anderen Funktionen und beginnt mit def (funktionsbasierte Allzweckansicht).

* Informationen zu Ansichtstypen

Mit views.py erstellte Ansichten sind grob unterteilt in ** klassenbasierte generische Ansichten **, die mit class beginnen, und ** funktionsbasierte generische Ansichten **, die mit def beginnen. Da dieses Mal drei Arten von Bildschirmen erstellt werden müssen, haben wir sie in klassenbasierten Allzweckansichten nur zum Erstellen, Detaillieren und Aktualisieren implementiert. Mit dieser Funktion können Sie einen Bildschirm mit CRUD-Funktion und Formular mit weniger Code erstellen. Da Sie jedoch keine Ansicht ohne Vorlage erstellen können, ist nur Löschen eine funktionsbasierte Allzweckansicht. (Für Details klicken Sie hier](https://qiita.com/dai-takahashi/items/7d0187485cad4418c073))

Nachwort

Ich war hier und da süchtig nach Fehlern, aber es gelang mir, eine App mit minimaler Funktionalität zu erstellen. Dieses Mal habe ich die Flash-Nachricht nicht ausgeführt, als das Posten / Aktualisieren oder Löschen erfolgreich war oder mit CSS dekoriert wurde. Daher möchte ich sie später implementieren.

Referenz

Wie erstelle ich eine App im Allgemeinen?

Erstellen Ihrer ersten Django-App (Django-Dokumentation)

So erstellen Sie eine nicht klassenbasierte Löschfunktion: DjangoBrothers

Informationen zu klassenbasierten generischen Ansichten

Einführung in klassenbasierte Allzweckansichten in Django und Beispielverwendung Sammeln der allgemeinen Klassenansichten von Django und Erwähnen der Implementierung

Liste der klassenbasierten generischen Ansichten: Code for Django

Eine Sammlung von Argumenten und Methoden, die in klassenbasierten Allzweckansichten verwendet werden können: Ganeshas Antennenladen

Andere

Verwenden Sie success_url und get_success_url, reverse und reverse_lazy richtig: Ganeshas Antennenladen

Über get_absolute_url (für das Modell verwendete Methode): IT Engineer Lab

Recommended Posts

Erstellen Sie eine einfache CRUD-App mit der generischen Klassenansicht von Django
Erstellen Sie eine Shogi Score Management App mit Django 4 ~ Create View ~
Erstellen Sie die CRUD-API mit der Fast API
Erstellen Sie eine einfache GUI-App in Python
Erstellen Sie eine einfache Web-App mit Flasche
Ajax in Django (mit generischer Klassenansicht)
Erstellen Sie mit PyLearn2 eine App zur falschen Unterstützung
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 1 ~
DJango Hinweis: Von Anfang an (mit einer generischen Ansicht)
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 2 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 3 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 4 ~
[CRUD] [Django] Erstellen Sie eine CRUD-Site mit dem Python-Framework Django ~ 5 ~
Erstellen Sie einen (einfachen) REST-Server
Erstellen Sie einen einfachen Textlint-Server
Erstellen Sie eine Shogi Score Management App mit Django 2 ~ Datenbankeinstellungen ~
Erstellen Sie eine Shogi Score Management App mit Django 6 ~ Split Template ~
Erstellen und Bereitstellen von Django-Apps (PTVS) mithilfe des Azure Table-Speichers
Erstellen Sie einen einfachen geplanten Stapel mit Dockers Python Image und parse-crontab
Erstellen Sie mit tkinter eine Python-GUI
Erstellen Sie ein verschachteltes Wörterbuch mit defaultdict
Erstellen einer einfachen Tabelle mit Stettytable
Erstellen Sie mit Boost.Python einen C-Sprach-Wrapper
Erstellen Sie eine Shogi-Score-Management-App mit Django 3 ~ Django Standard-Management-Site-Einstellungen ~
Erstellen Sie mit Class einen Python-Funktionsdekorator
Erstellen Sie mit dem Sympy-Modul ein Diagramm
Erstellen Sie eine GUI-App mit Tkinter of Python
[Python] Erstellen Sie eine Stapelumgebung mit AWS-CDK
Erstellen Sie eine Python-GUI-App in Docker (PySimpleGUI).
Erstellen Sie mit Pandas einen Datenrahmen aus Excel
Erstellen Sie eine Web-App, die PDF mit Flask und PyPDF2 in Text konvertiert