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.
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 "Anfänger erstellen einfache Apps 1")
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
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.
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). ** ** **
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!".
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
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.
Der Browser kommuniziert mit dem Server über HTTP, die Methode ist jedoch POST. Tatsächlich gibt es in register.html eine Beschreibung als "