[PYTHON] Django-Anfänger erstellen einfache Apps 4

Einführung

Django Eine Fortsetzung von 3 für Anfänger, um einfache Apps zu erstellen. Letztes Mal habe ich C von CRUD erstellt, dh Teil mit klassenbasierter Ansicht erstellen. Dieses Mal möchte ich von der klassenbasierten Ansicht zur Funktionsansicht umschreiben und verfolgen, wie Django funktioniert, während ich die beiden vergleiche.

Serientabelle für Anfänger zum Erstellen einfacher Apps

Umgebung

Ubuntu 20.04 LTS Python 3.8.2 Django 3.02

Annahme

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 "Anfänger erstellen einfache Apps 1")

1. Schreiben Sie Class IndexView in def index um

index_view



class IndexView(generic.ListView):
    template_name = 'myapp/index.html'
    context_object_name = 'movie_list'
    queryset = Movie.objects.all()

#Das Folgende ist Funktion-view

def index(request):
    movie_list = Movie.objects.all()
    return render(request, 'myapp/index.html', {'movie_list': movie_list})

Eigentlich endete es in 2 Zeilen ... Funktionsansicht hat kürzeren Code. Was machst du

  1. Sammeln Sie alle Daten aus dem Film des Modells (Datenbank) und fügen Sie sie in einem Objekt (Instanz) namens movie_list zusammen.
  2. Verwenden Sie movie_list als Material und rendern Sie es in index.html

Gelerntes Wissen

1-1. Was ist eine Anfrage?

Wenn eine Seite angefordert wird, erstellt Django ein HttpRequest-Objekt, das Metadaten zur Anforderung enthält. Django übergibt dann HttpRequest als erste Funktion der Ansichtsfunktion, um die entsprechende Ansicht zu laden. Jede Ansicht sollte ein HttpResponse-Objekt zurückgeben.

Was ist die Argumentationsanfrage? Wer verlangt was? Ich habe mich gefragt, aber die Identität von ** request war ein Objekt (eine Instanz) ** von HttpRequest.

1-2. Was ist render ()?

Combines a given template with a given context dictionary and returns an HttpResponse object with that rendered text.

Die Renderfunktion formatiert Daten vom Typ Wörterbuch in eine HTML-Datei und zeigt sie an. ** Das letzte, was mit render () herauskommt, ist das HttpResponse-Objekt (Instanz). ** ** **

1-3. Was sind Objekte?

Each non-abstract Model class must have a Manager instance added to it. Django ensures that in your model class you have at least a default Manager specified. If you don’t add your own Manager, Django will add an attribute objects containing default Manager instance.

** Es gibt einen Manager namens zum Abrufen der Daten im Modell (Datenbank), dessen Name Objekte ist. ** Also bedeutet "Movie.objects.all ()" "Filmobjekte (Manager), bringen Sie alle Daten!".

2. Schreiben Sie die Klasse MovieDetailView neu, um moviedetail zu definieren

detail_view



class MovieDetailView(generic.DetailView):
    model = Movie
    template_name = 'myapp/detail.html'

#Funktion von hier-view

def moviedetail(request, pk):
    m = Movie.objects.get(pk=pk)
    return render(request, 'myapp/detail.html', {'movie': m})

Hier wurden nur zwei Zeilen benötigt. Das pk im (Anfrage, pk) Teil ist das<int: pk>des Pfads ('movie / <int: pk> /', beschrieben in urls.py. Dies wird geändert. Ja. Wenn Sie die URL in "<int: movie_id>" ändern, ändern Sie sie in "(request, movie_id)". Mit dieser Funktion tun Sie Folgendes

  1. Rufen Sie die Daten in Movie (Datenbank) ab, deren pk (Primärschlüssel) mit der Anforderung übereinstimmt, und machen Sie daraus ein Objekt mit dem Namen m
  2. Rendern Sie m als Film in detail.html Ich frage mich, ob das der Fall sein wird.

3. Schreiben Sie die Klasse RegisterDirectorView in def registerdirector um

register_director_view


class RegisterDirectorView(generic.CreateView):
    model = Director
    form_class = DirectorForm
    template_name = 'myapp/register.html'
    def get_success_url(self):
        return reverse('myapp:registermovie') 

#Funktion von hier-view

def registerdirector(request):
    if request.method == "POST":
        form = DirectorForm(request.POST)
        if form.is_valid():
            d = form.save(commit=False)
            d.save()
            return redirect('myapp:registermovie')
    else:
        form = DirectorForm()
        return render(request, 'myapp/register.html', {'form': form})

Der große Unterschied zwischen klassenbasierter Ansicht und Funktionsansicht besteht hier bei CreateView. Die Funktionsansicht ist leichter zu verstehen, um den Mechanismus zu verstehen.

Gelerntes Wissen

3-1. Request.method == Was ist "POST"?

Der Browser kommuniziert mit dem Server über HTTP, die Methode ist jedoch POST. Tatsächlich gibt es in register.html eine Beschreibung als "

", was bedeutet, dass beim Drücken der Schaltfläche "Speichern" die Daten als POST gesendet werden, der mit dieser Zeile verflochten ist.

3-2. Form = Was ist DirectorForm (request.POST)?

request.POST ist ein wörterbuchähnliches Objekt. Sie können den Schlüssel für den Zugriff auf die von Ihnen gesendeten Daten angeben. In diesem Fall gibt request.POST ['choice'] die ID der ausgewählten Auswahl als Zeichenfolge zurück. Der Wert von request.POST ist immer eine Zeichenfolge.

Mit anderen Worten, die in "request.POST" eingegebenen Daten sind enthalten. Dies bedeutet, dass ein Objekt namens form erstellt wird, indem es auf DirectorForm angewendet wird.

3-3. Was ist form.is_valid ()?

The primary task of a Form object is to validate data. With a bound Form instance, call the is_valid() method to run validation and return a boolean designating whether the data was valid:

Gibt an, ob ein Objekt namens form gültig ist. Wenn eine Eingabe ausgelassen wird, wird damit gespielt. Ich kannte die Begriffe Validierung (Überprüfung, ob die eingegebenen Daten korrekt waren) und Bereinigung der Daten (Formatierung der Daten in ein benutzerfreundliches Formular) nicht, daher war ich zuerst krank.

3-4. Was ist d = form.save (commit = False)?

This save() method accepts an optional commit keyword argument, which accepts either True or False. If you call save() with commit=False, then it will return an object that hasn’t yet been saved to the database. In this case, it’s up to you to call save() on the resulting model instance. This is useful if you want to do custom processing on the object before saving it, or if you want to use one of the specialized model saving options. commit is True by default.

Das Formular mit den Daten wird in einem Objekt namens d gespeichert, befindet sich jedoch noch nicht in der Datenbank. Ich habe mich gefragt, warum ich das getan habe, aber es scheint, dass ich diesem Formular später Daten hinzufügen und sie erneut in der Datenbank speichern kann. Ist es so etwas wie temporäre Speicherung? Dann, wenn es schließlich in der Datenbank mit d.save () in der nächsten Zeile gespeichert wird.

Andere

redirect () sagt "Fliege zur Adresse in ()" und unten sagt "Erstelle ein leeres Formular und rendere es in register.html". Wenn Sie das auf diese Weise erlernte Wissen nutzen, können Sie immer mehr Code lesen. Ich bin froh, dass ich mich weiterentwickelt habe.

4. Schreiben Sie die Klasse RegisterMovieView neu, um registermovie zu definieren

register_movie_view



class RegisterMovieView(generic.CreateView):
    model = Movie
    form_class = MovieForm
    template_name = 'myapp/register.html'
    def get_success_url(self):
        return reverse('myapp:movie_detail', kwargs={'pk': self.object.pk }) 

#Funktion von hier-view

def registermovie(request):
    if request.method  == "POST":
        form = MovieForm(request.POST)
        if form.is_valid():
            m = form.save(commit=False)
            m.save()
            return redirect('myapp:movie_detail', pk=m.pk)
    else:
        form = MovieForm()
        return render(request, 'myapp/register.html', {'form': form})

Der Code ist fast der gleiche wie beim letzten Mal. Wenn Sie es wagen, es zu sagen, ist es der Teil "Weiterleitung (" myapp: movie_detail ", pk = m.pk)", aber bedeutet es "fliegen Sie den pk des Objekts m als den pk des movie_detail"?

5. Schreiben Sie die Klasse WritingLogView neu, um das Schreibprotokoll zu definieren

writing_log_view



class WritingLogView(generic.CreateView):
    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 }) 

#Funktion von hier-view

def writinglog(request):
    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:
        form = LogForm()
        return render(request, 'myapp/register.html', {'form': form})

Der Code ist fast der gleiche. "Ich kann lesen! Ich kann lesen!" (Von Muska)

Nachwort

Die klassenbasierte Ansicht ist am Ende einfacher zu schreiben, aber die Funktionsansicht ist leichter zu verstehen und es scheint, als könnten Sie die Details erreichen. Ist es wie ein automatisches Auto und ein manuelles Auto? Nein, wenn Sie es in die Funktionsansicht umschreiben, funktioniert es nur, wenn Sie urls.py richtig umschreiben. Es ist also nicht schlecht. Das nächste Mal planen wir die Implementierung von CRUD UD, dh Aktualisieren und Löschen. Es ist wahrscheinlich einfacher zu verstehen, wenn Sie den Code wie dieses Mal nebeneinander schreiben. Wenn Sie Fehler haben, weisen Sie uns bitte darauf hin und geben Sie uns eine Anleitung. Ist das Ziel nah ...?

Recommended Posts

Django-Anfänger erstellen einfache Apps 4
Django-Anfänger erstellen einfache Apps 2
Django-Anfänger erstellen einfache Apps 5
Python-Anfänger Nr. 1 stellen einfache Tools zum Lernen von englischen Wörtern her
Django Oscar einfaches Tutorial
[Django] Erstellen Sie ein Pulldown-Menü
(Für Anfänger) Versuchen Sie, mit Django eine einfache Web-API zu erstellen
Hallo Welt (Anfänger) mit Django
Django-Anfänger versuchten, die Umgebung aufzubauen
[Für Anfänger] Django -Entwicklungsumgebung Bau-
Machen Sie einen Filter mit einer Django-Vorlage