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
OS: centos7 Django: 3.0.6 Python: 3.8.3
$ python manage.py start project mysite
$ cd mysite
$ python manage.py startapp bookers
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
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.
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.
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>
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
Wenn die Zeichen angezeigt werden, die Sie in die HTML-Datei geschrieben haben, sind die Routing-Einstellungen abgeschlossen.
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.
↑ Listenbildschirm, der furchtbar trübe ist, weil der Bildschirm nicht dekoriert ist
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. ↑ Da nichts zu viel ist, habe ich auch einen Link zum Bearbeitungsbildschirm (Update) und Listenbildschirm (Zurück) eingefügt.
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.
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".
Zum Detailbildschirm umgeleitet und den richtigen Titel korrigiert!
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).
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))
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.
Erstellen Ihrer ersten Django-App (Django-Dokumentation)
So erstellen Sie eine nicht klassenbasierte Löschfunktion: DjangoBrothers
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
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