Django Eine Fortsetzung von 4 für Anfänger, um einfache Apps zu erstellen. Ziel ist es, komplizierte und problematische Dinge so weit wie möglich zu beseitigen, eine vereinfachte Webanwendung zu erstellen und zu lernen, wie Django funktioniert. Verstehe nur, was verbunden ist und wie es sich um das Backend bewegt. Wenn Sie CRUD (Erstellen, Lesen, Aktualisieren, Löschen) implementieren und sicher verschieben, erreichen Sie das Ziel. Beim letzten Mal habe ich von der klassenbasierten Ansicht zur Funktionsansicht umgeschrieben und die beiden verglichen, um zu sehen, wie Django funktioniert. Dieses Mal möchte ich den Update-Teil und den Delete-Teil von CRUD implementieren. Tatsächlich ist es also vollständig.
Ubuntu 20.04 LTS Python 3.8.2 Django 3.02
Der Projektname lautet config und der App-Name lautet myapp. Mit anderen Worten, die folgenden zwei Befehle wurden ausgeführt
(myenv)$ django-admin startproject config .
(myenv)$ python manage.py startapp myapp
Das Vorlagenverzeichnis wird in derselben Hierarchie wie manage.py erstellt, und settings.py wurde ebenfalls geändert. (Siehe "Django-Anfänger erstellen einfache Apps 1)
Das Protokoll wird auf der Seite des Filmdetailbildschirms angezeigt. Wenn Sie das Protokoll für eine Weile bearbeiten möchten, können Sie es durch Drücken der Taste bearbeiten.
Wenn Sie eine neue Seite erstellen, erstellen Sie sie in der Reihenfolge urls.py → views.py → template. Ich denke, dass durch das Einpassen der Herstellungsmethode in eine Form auf diese Weise das Auslassen von Gedanken verringert wird. Schreiben Sie zuerst die Adresse update / log / <int: pk> /
, wenn Sie das Protokoll (Impression) in urls.py aktualisieren.
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'),
# (Unterlassung)
path('update/log/<int:pk>/', views.UpdateLogView.as_view(), name='updatelog'), #Fügen Sie diese Zeile hinzu
]
Schreiben Sie als Nächstes den Code von UpdateLogView, der klassenbasiert ist, in views.py.
myapp/views.py
class UpdateLogView(generic.UpdateView):
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 })
#Wenn Funktion-Wenn Sie in Ansicht schreiben, ist es wie folgt
def updatelog(request, pk):
obj = get_object_or_404(Log, id=pk)
if request.method == "POST":
form = LogForm(request.POST, instance=obj)
if form.is_valid():
form.save()
return redirect('myapp:movie_detail', pk=obj.movie.pk)
else:
form = LogForm(instance=obj)
return render(request, 'myapp/register.html', {'form': form})
In Class UpdateLogView
sollten vier Elemente angegeben werden (wie in der vorherigen CreateView).
So können Sie in der Funktionsansicht sehen, wie es tatsächlich mit dem def update log
funktioniert.
Der Anforderungsteil von (request, pk)
ist ein HttpRequest-Objekt, das durch Drücken der Schaltfläche Bearbeiten in detail.html erstellt werden kann. Die ID-Nummer des Protokolls wird im pk-Teil eingegeben. Mit diesem Paket wird eine Nummer in den Teil <int: pk> von urls.pys update / log / <int: pk> / eingegeben. Hinweis unten.
Damit ist die Update-Implementierung abgeschlossen. Implementieren Sie als Nächstes den Teil Löschen.
Ich möchte zwei Funktionen, eine zum Löschen des Protokolls (Impression) und die andere zum Löschen der Filmdaten. Dann sollten Sie zwei Codesätze in urls.py und zwei in views.py schreiben.
myapp/urls.py
from django.urls import path, include
from myapp import views
app_name = 'myapp'
urlpatterns = [
path('', views.index, name='index'),
# (Unterlassung)
path('delete/log/<int:pk>/', views.deletelog, name='deletelog'), #Fügen Sie diese Zeile hinzu
path('delete/movie/<int:pk>/', views.deletemovie, name='deletemovie'), #Fügen Sie diese Zeile hinzu
]
Die hier beschriebene Adresse ist der Bestätigungsbildschirm zum Löschen. Der Ort, an dem "Kann ich das löschen?" Schreiben Sie als Nächstes den Code in views.py.
myapp/views.py
class DeleteLogView(generic.DeleteView):
model = Log
def get_success_url(self):
return reverse('myapp:movie_detail', kwargs={'pk': self.object.movie.pk })
#Funktion von hier-view
def deletelog(request, pk):
obj = get_object_or_404(Log, id=pk)
movie_id = obj.movie.pk
if request.method =="POST":
obj.delete()
return redirect('myapp:movie_detail', pk=movie_id)
context = {'obj':obj}
return render(request, "myapp/delete.html", context)
In der klassenbasierten Ansicht müssen Sie lediglich das Modell und die Seite angeben, die bei Erfolg übersprungen werden sollen. Wenn jedoch nur diese beiden Elemente vorhanden sind, muss der Name der Löschbestätigungsseite "○○ _confirm_delete.html" lauten. Der Name des Modells wird in 〇〇 eingegeben. Diesmal ist es "log_confirm_delete.html". In der Funktionsansicht wurde "delete.html" erstellt und als Löschbestätigungsseite verwendet.
Die klassenbasierte Ansicht erledigt dies automatisch, und in der Funktionsansicht musste ich festlegen, dass nach dem Löschen des Protokolls der Detailbildschirm nach dem Löschen angezeigt wird. Wenn Sie die Film-ID des Protokolls vor dem Löschen des Protokolls nicht speichern, können Sie nicht zum Bildschirm mit den Filmdetails zurückkehren. Hinweis unten.
myapp/views.py
class DeleteMovieView(generic.DeleteView):
model = Movie
def get_success_url(self):
return reverse('myapp:index')
#Funktion von hier-view
def deletemovie(request, pk):
obj = get_object_or_404(Movie, id=pk)
if request.method == "POST":
obj.delete()
return redirect('myapp:index')
context = {'obj':obj}
return render(request, "myapp/delete.html", context)
Der Code ist fast eine Wiederholung des Löschprotokolls. Der einzige Unterschied besteht darin, dass nach dem Löschen zum Index gesprungen wird.
Diese Vorlage ist der Löschbestätigungsbildschirm (delete.html). Dieselbe delete.html kann verwendet werden, unabhängig davon, ob das Protokoll oder die Filmdaten gelöscht werden. Obwohl das Display unangenehm aussieht (eines der oberen und unteren ist leer).
myapp/templates/myapp/delete.html
<form method="POST">
{% csrf_token %}
{{obj.movie}}<br> #Dies wird beim Löschen des Protokolls angezeigt
{{obj.text}}<br>
------------------------------<br>
{{obj.title}}<br> #Dies wird angezeigt, wenn Sie den Film löschen
{{obj.director}}<br>
Do you want to delete it?<br>
<button type="submit">OK</button>
</form>
Fügen Sie der Datei detail.html mit Schaltflächen zum Bearbeiten und Löschen hinzu
templates/myapp/detail.html
{% for log in movie.log.all %}
<li>
<button onclick="location.href='{% url 'myapp:updatelog' log.id %}'">edit</button>
<button onclick="location.href='{% url 'myapp:deletelog' log.id %}'">delete</button>
{{ log.text }}
</li>
{% endfor %}
Damit ist die Implementierung des Löschteils abgeschlossen.
index.html
<a href="{% url 'myapp:registerdirector' %}">Register Director</a><br>
<a href="{% url 'myapp:registermovie' %}">Register Movie</a><br>
<a href="{% url 'myapp:writinglog' %}">Writing Log</a>
--Funktion + Link hinzufügen, damit Sie das Protokoll des Films über detail.html eingeben können
views.py
def writingthismovielog(request, movie_id):
obj = get_object_or_404(Movie, id=movie_id)
form = LogForm({'movie':obj})
if request.method == "POST":
form = LogForm(request.POST)
if form.is_valid():
l = form.save(commit=False)
l.save()
return redirect('myapp:movie_detail', pk=l.movie.pk)
else:
return render(request, 'myapp/register.html', {'form': form})
Als ich den Knopf drückte, war bereits nur der Titel des Films eingegeben und ich wollte nur meine Eindrücke schreiben. Der Punkt des Einfallsreichtums ist form = LogForm ({'movie': obj})
. Sie haben ein Objekt erstellt, den Titelteil in einem Wörterbuchtyp angegeben und in LogForm abgelegt. Ich habe es versucht und es hat funktioniert. Das liegt daran, dass es so sein sollte! Es macht Spaß, wenn es so funktioniert, wie ich es erwartet habe. Es ist nur diese eine Zeile, aber ich bin wirklich glücklich darüber.
detail.html
<a href="{% url 'myapp:writingthismovielog' movie.id %}">Write log of this movie data</a><br>
<a href="{% url 'myapp:deletemovie' movie.id %}">Delete this movie data</a><br>
<a href="{% url 'myapp:index' %}">To Index</a><br>
Fügen Sie dann den obigen Link in detail.html ein und schließen Sie die Feineinstellung ab.
Update and Delete Log | Delete Movie data |
---|---|
Verwenden Sie für das obige GIF-Video SimpleScreenRecord, um den Bildschirm als Video aufzunehmen, und ffmpeg, um das Video in GIF zu konvertieren. Es ist einfach und verstimmt. Geht die Welt nicht zu weit?
Ich konnte CRUD (Erstellen, Lesen, Aktualisieren, Löschen) implementieren, obwohl es nicht bereitgestellt wurde und schlecht aussah, nur um zu arbeiten. Zumindest funktioniert es. Also, ** Goooooooaaaaallll! ** Ich konnte die minimalen Grundlagen festhalten. Zum ersten Mal war diese App (Modoki) eine Erfahrung mit dem Gefühl, dass "ich selbst programmieren konnte!", Was zu einem leichten Vertrauen führte, dass ich 0 zu 1 machte. Nennen Sie diesen "movielogrecord" und setzen Sie den Code auf github. Sowohl Unwissenheit als auch Scham sind für die Öffentlichkeit zugänglich. https://github.com/soh506/movielogrecord.git. Danke fürs Lesen. Wir freuen uns darauf, Ihnen noch ein wenig zu helfen. Lassen Sie uns als nächstes das Frontend untersuchen, damit es besser aussieht. Das ewige Anfängerstudium geht weiter ...
Recommended Posts