Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 1, 2, 3 ~

Einführung

Beim letzten Mal habe ich mit Docker eine Django-Umgebung erstellt und versucht, sie leicht zu berühren. Dieses Mal werde ich mich durch das offizielle Tutorial etwas tiefer mit Django befassen und gleichzeitig als Ergänzung zum vorherigen Mal dienen. Dieses Mal bin ich PU von 1-3 des Tutorials, wo ich persönlich dachte, dass es wichtig ist.

Django Tutorial

Über include ().

include () ist eine Funktion, die einen Verweis auf URLconf (hier url.py) darstellt. Legen Sie den Pfad mit "urls.py" im Argument und dem Namen "url.py" fest, auf den im zweiten Argument verwiesen werden soll. Da wir hier auf "urls.py" von Umfragen verweisen möchten, setzen wir "polls.urls".

Sie können vier Argumente für "path ()" festlegen: "route, view, kwargs und name". route ist die Stammadresse der Anwendung. view gibt die view function an, die Sie aufrufen möchten. kwargs kann jedes Schlüsselwort als Wörterbuch an view übergeben, es ist optional. Wenn name einen Namen in URL hat, ist dies eine globale URL, auf die von überall in Django verwiesen werden kann.

Schauen wir uns diese beiden Beispiele an.


path('polls/', include('polls.urls'))


In dieser Beschreibung wird beispielsweise "route" zum Teil von "polls /" und "view" wird "include" ("polls.urls"). Gab es eine "Ansicht" in "include" ("polls.urls")? Wenn Sie so denken, schauen Sie sich noch einmal urls.py an. Sie können sehen, dass es am Anfang importiert wurde.

Übrigens kann "view" im zweiten Argument zusätzlich zu "include ()" wie diesmal auch die Ausgabe von "as_views" übernehmen. as_views ist eine class only-Methode, die eine Funktion erstellt, die die Ansichtsbedingungen in Django erfüllt. Weitere Informationen finden Sie unter Referenzartikel und im Dokument. Wenn Sie es jedoch kauen, bestimmt Django zuerst die Anforderungsmethode mit dem Namen "Versandmethode" und diese Anforderungsmethode Es gibt eine Methode, die eine Methode mit demselben Namen wie ausführt. In diesem Fall zum Beispiel aus dem vorherigen Artikel




class SampleView(View):
    def get(self, request, *args, **kwargs):
        return render(request, 'app_folder/page01.html')

    def post(self, request, *args, **kwargs):
     	input_data = request.POST['input_data']
     	result = SampleDB.objects.filter(sample1=input_data)
     	result_sample1 = result[0].sample1
     	result_sample2 = result[0].sample2
     	context={'result_sample1':result_sample1, 'result_sample2':result_sample2}
     	return render(request, 'app_folder/page02.html', context=context,)

top_page = SampleView.as_view()


In diesem Teil wird SampleView.get () ausgeführt, wenn "request.method ==" GET "hier ist. "as_view" wird als "cls" instanziiert (wenn es eine Instanz einer Klassenmethode wird, wird die Klasse selbst durch "cls" anstelle von "self" dargestellt) und erstellt eine Funktion, die diese "dispatch" -Methode ausführt. Wird "return" sein, was bedeutet, dass es als Argument genommen werden kann, weil es als "view" klassifiziert ist.

Nun, was ist "Name"?


urlpatterns = [
	path('', views.index, name='index')

]


Es ist so ein Typ. Auf diese Weise können Sie den Prozess ausführen, dass "views.index" aufgerufen wird, wenn Sie die URL in Form von "root index / index" oder "root index /" aufrufen. Gegen Ende wird es eine verständlichere Verwendung geben. Denken Sie also vorerst daran, dass der Pfad benannt wird.

Beziehungen in Django



from django.db import models

# Create your models here.

class Question(models.Model):
	question_next = models.CharField(max_length=200)
	pub_date = models.DateTimeField('date published')

class Choice(models.Model):
	question = models.Foreignkey(Question, on_delete=models.CASCADE) #Beziehung
	choice_text = models.CharField(max_length=200)
	votes = models.IntegerField(default=0)

In Form von models.Foreignkey (Klassenname der zugehörigen Tabelle, on_delete = models.CASCADE) festlegen. In diesem Fall lautet die Beziehung "Frage: Auswahl = 1: Mehrfach". Einfach ausgedrückt gibt es mehrere Antworten auf eine Frage.

on_delete Im Folgenden wird festgelegt, ob das ihm zugeordnete Objekt gelöscht werden soll, wenn das referenzierte Objekt gelöscht wird, oder ob es beibehalten werden soll. Im Fall von "CASCADE" bedeutet dies, dass alle zugehörigen Objekte gelöscht werden. Zum Beispiel

# polls_question

id		question_next

0		What`s_up?



# polls_choice


id		choice_text		votes		question_id
0		I`m_heading		 0				0
1		Stomachache		 1				1


Angenommen, Sie haben einen Tisch wie Hier werden die Daten von "id = 0" in der Tabelle "polls_question" gelöscht, und die Daten von "id = 0" und "id = 1" in der Tabelle "polls_choice", die darauf verweisen, werden ebenfalls gelöscht. Es wird sein. Dies ist der Datenlöschvorgang, wenn "CASCADE" angegeben ist. Es gibt andere Möglichkeiten, aber es scheint, dass ich oft "CASCADE" benutze. Da die Daten in der Beziehung etwas schwierig zu handhaben sind, ist es meines Erachtens besser, alle Daten in beiden Tabellen zu löschen, die beim Löschen voneinander abhängig sind. Natürlich können Sie angeben, dass der andere als null behandelt wird oder dass nur der andere vollständig gelöscht wird.

Migrations- und API-Operationen in Django (Interaktion mit der Datenbank)

Nun, wenn Sie so weit sind, können Sie die Tabelle vervollständigen, indem Sie mit "migrieren" migrieren. Es gibt jedoch einen Befehl, der "SQL-Anweisung" ausgibt und zeigt, was "migrieren" tut, also werde ich es versuchen. ..

python manage.py makemigrations polls

Verwenden Sie im Fall von Docker den Befehl docker exec, um den Container einzugeben, in das Verzeichnis mit der Datei manage.py zu wechseln und ihn auszuführen. Sie können die Migrationen für diese Anwendung speichern, indem Sie den Namen des Anwendungsordners im Befehl makemigrations angeben. Zum Beispiel, wenn Sie diesen Befehl dieses Mal ausführen

Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model Question
    - Create model Choice


Somit wird der Migration der Name 0001 gegeben und die Datei gespeichert. Übrigens habe ich diesmal einen Fehler bei der Migration gemacht, und ich habe einen Fehler in den Eigenschaften der in der Tabelle registrierten Daten gemacht, also habe ich sie geändert und erneut "Migrationen" durchgeführt.

In diesem Fall wird die folgende Datei "0002_auto_20200408_1848.py" erstellt und die Tabelle wird aktualisiert, wenn "migrieren" erneut.

0002_auto_20200408_1848.py



# Generated by Django 3.0 on 2020-04-08 18:48

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('polls', '0001_initial'),
    ]

    operations = [
        migrations.RenameField(
            model_name='question',
            old_name='question_next',
            new_name='question_text',
        ),
    ]


Als nächstes wollen wir sehen, was passiert, wenn diese Migration "migrieren" ist.

 py manage.py sqlmigrate polls 0001

Wenn Sie den Anwendungsordner und die Migration im Befehl sqlmigrate wie folgt angeben

--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_next` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL, `question_id` integer NOT NULL);
ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);


Die SQL-Anweisung wird folgendermaßen angezeigt, und Sie können sehen, was der Befehl migrate tut. Es ist leicht zu erkennen, welche Art von SQL-Anweisung zum Erstellen einer Tabelle verwendet wird. Nachdem wir dies überprüft haben, erstellen wir eine Tabelle durch "Migrieren".

Versuchen wir den Befehl shell wie im Tutorial und interagieren mit der Datenbank.

#Importieren Sie das Modell und holen Sie sich die Klasse
>>> from polls.models import Choice, Question  # Import the model classes we just wrote.

#Holen Sie sich alle Objekte der Question-Klasse. Da keine Daten vorhanden sind, ist das Ergebnis leer.
>>> Question.objects.all()
OUT:<QuerySet []>

#Um das Datum / Uhrzeit-Modul zu verwenden, django.Importieren Sie die darin enthaltene Zeitzonenklasse aus Utils.
>>> from django.utils import timezone

#Weisen Sie Variablen Variablen in Form von Objekten zu
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

#Daten speichern
>>> q.save()

#Dateneigenschaften abrufen
>>> q.id
1

>>> q.question_text
"What's new?"

>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)


#Versuchen Sie, die Eigenschaften zu ändern
>>> q.question_text = "What's up?"
>>> q.save()

#Fehler
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

Schreiben Sie models.py neu, um Fehler zu vermeiden.

import datetime
from django.db import models
from django.utils import timezone

# Create your models here.

class Question(models.Model):
	question_text = models.CharField(max_length=200)
	pub_date = models.DateTimeField('date published')

	#Addiere 1
	def __str__(self):
		return self.question_text

	#Addiere 2
	def was_published_recently(self):
		return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
	question = models.ForeignKey(Question, on_delete=models.CASCADE)
	choice_text = models.CharField(max_length=200)
	votes = models.IntegerField(default=0)

	#Addiere 3
	def __str__(self):
		return self.choice_text

__str__ () ist eine Objektmethode. Hier ist es beispielsweise dafür verantwortlich, "self" als Argument festzulegen, um die Klasse zu instrumentieren und jede Eigenschaft für den Menschen lesbar zu machen. Der Grund, warum das Objekt früher in "Question.objects.all ()" nicht gut angezeigt wurde, ist, dass das Objekt maschinenlesbar blieb. Mit anderen Worten, das Objekt sieht für unsere Augen wie ein "Objekt dieser Klasse" aus, also werden wir ihm einen Namen geben.

Addition 2 ist die ursprüngliche Methode. Da es sich nach der Rückgabe um eine Formel handelt, wird True oder False zurückgegeben. Da "timezone.now ()" das aktuelle Datum und "datetime.timedelta (Tage = 1)" einen Tag später ist, ist "heute - morgen" gestern und darüber hinaus ist "self.pub_date" wahr. .. Mit anderen Worten, es ist eine Methode, die "True" zurückgibt, wenn die Daten in der Fragentabelle nach gestern erstellt wurden. Es gibt jedoch einen Fehler, dass "True" zurückgegeben wird, selbst wenn es sich um ein sogenanntes zukünftiges Datum handelt. Die Fragentabelle bedeutet, den Inhalt der Frage zu registrieren, aber das Stellen einer Frage muss immer zeitlich vergangen oder gegenwärtig sein. Sie haben gestern gefragt, Sie haben gesagt, Sie haben heute gefragt, aber Sie haben nicht gesagt, Sie haben morgen gefragt, oder? Dieser Fehler scheint in den Elementen nach 4 des Tutorials behoben zu sein, daher werde ich ihn vorerst so lassen, wie er ist.

Führen Sie nun den Shell-Befehl erneut aus.


>>> from polls.models import Choice, Question

# __str__Da ich die Methode hinzugefügt habe, Frage der Frage Eigenschaft_Text wird als Name des Objekts bezeichnet.

>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

#Stellen Sie sicher, dass Sie die Objekte mit der Filtermethode nach ID eingrenzen können.

>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>

#Frage auf die gleiche Weise_Versuchen Sie, die Objekte einzugrenzen, deren Text mit was beginnt.
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

#Holen Sie sich Objekte in diesem Jahr hinzugefügt

>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>



# id=Fehler, da die Daten von 2 nicht vorhanden sind
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.


#Ruft ein Objekt mit dem Primärschlüssel 1 ab. Normalerweise ist der Primärschlüssel id. Also hier pk=1 == id=Werden Sie 1
>>> Question.objects.get(pk=1)
<Question: What's up?>

#Überprüfen Sie die Funktionsweise der zusätzlichen 2 Methoden

>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True


#Instanziieren Sie ein Objekt, dessen Primärschlüssel 1 ist.
>>> q = Question.objects.get(pk=1)

#Rufen Sie das Auswahlobjekt auf, das den obigen Objekten zugeordnet ist. Der Punkt ist, wie viele Antworten auf die Frage. Da die Auswahltabelle keine Daten enthält, werden sie leer zurückgegeben.
>>> q.choice_set.all()
<QuerySet []>

# Question.objects.get(pk=1)Fügen Sie als verknüpfte Antwort drei Daten zur Auswahltabelle hinzu.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)

#Die Frage-Eigenschaft ist der externe Schlüssel der Auswahltabelle, dh die Primärschlüsselreferenz der Fragentabelle.
>>> c.question

#Daher ist, wie oben erwähnt, die Variable c q= Question.objects.get(pk=1)Da es gebunden ist, wird das folgende Ergebnis zurückgegeben.
<Question: What's up?>

# q = Question.objects.get(pk=1)Rufen Sie das zugehörige Choice-Objekt auf und zählen Sie die Anzahl der Objekte
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

#Grenzen Sie unter den Auswahlobjekten die Objekte ein, deren Erstellungsdatum für Fragen mit dem Primärschlüssel der referenzierten Fragentabelle in diesem Jahr verknüpft ist.

>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

#Löschen Sie ein bestimmtes Choice-Objekt.
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()



Schauen wir uns die Rolle von URLconf über views.py genauer an.

polls/views.py



from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse
from .models import Question

# Create your views here.
def index(request):
	latest_question_list = Question.objects.order_by('-pub_date')[:5]
	context = {
		'latest_question_list': latest_question_list,
	}
    return render(request, 'polls/index.html', context)

def detail(request, question_id):

	"""
	try:
		question = Question.objects.get(pk=question_id)
	except Question.DoesNotExist:
		raise Http404("Question does not exist")
	return render(request, 'polls/detaill.html', {'question': question})

	"""

	#Das Obige ist eine Django-Verknüpfung. erhalten_object_or_404 Methode

	question = get_object_or_404(Question, pk=question_id)
	return render(request, 'polls/detail.html', {'question': question})

def results(request, question_id):
	response = "You`re looking at the results of question %s."
	return HttpResponse(response % question_id)

def vote(request, question_id):
	return HttpResponse("You`re voting on question %s." question_id)




polls/urls.py




from django.urls import path
from . import views

app_name = 'polls'
urlpatterns = [
	path('', views.index, name='index'),
	path('<int:question_id>/', views.detail, name='detail'),
	path('<int:question_id>/results/', views.results, name='results'),
	path('<int:question_id>/vote/', vies.vote, name='vote'),

]


Ich habe vorhin path () erwähnt. Angenommen, Sie haben hier Zugriff auf / polls / 34 /. Erinnerst du dich, was mit den obigen Einstellungen passiert? Die richtige Antwort besteht darin, anhand der "urlpatterns" in "urls.py" zu bestimmen, an welche Ansichtsfunktion die Anforderung gesendet werden soll, und dann die dort aufgerufene Ansichtsfunktion auszuführen.

Lassen Sie uns etwas tiefer graben. Schauen Sie sich zunächst den Teil an, der im ersten Argument von path () angegeben ist. Ich habe früher gesagt, dass die Stammadresse in diesem Teil eingegeben wird. Zum Beispiel ist die erste Beschreibung leicht zu verstehen. Auf diese Weise lautet das hier angegebene URL-Muster "/ polls /". Mit anderen Worten, Sie können sehen, dass polls / automatisch angegeben wird, auch wenn das erste Argument leer ist. (Wenn nicht angegeben, tritt ein Fehler auf.) Dies bedeutet, dass Django beim Empfang der Anforderung zuerst die in "ROOT_URLCONF" von "settings.py" angegebene Datei "urls.py" lädt. Dies ist eine Datei, die die URL des gesamten Systems entwirft. Im vorherigen Beispiel ist dies "project / project / urls.py". Nehmen wir an, es gibt dort eine solche Beschreibung.



urlpatterns = [
	#URL für den Zugriff auf die Verwaltungssite
    path('admin/', admin.site.urls),
    #URL für den Zugriff auf die diesmal erstellte App "App"
    path('app/', include('app.urls')),
    #Wenn Sie keine URL angeben
    path('', views.index, name='index'),
    path('polls/', include('polls.urls')),
]


Einige Leute haben den Mechanismus vielleicht schon verstanden, als sie so weit gekommen sind. Stellen Sie sich den ersten path () Teil als Zauber vor. Die dritte Beschreibung ist dieselbe wie zuvor. Bemerkenswert sind die zweite und vierte Beschreibung. Wenn Sie hier eine solche Beschreibung vornehmen, können Sie auf "urls.py" jeder Anwendung verweisen und die Anforderung mit der Variablen "urlpatterns" abgleichen. Wenn Sie hier "path (" polls / ", include (" polls.urls "))" schreiben, gibt es eine Anforderung wie "/ polls / 34 /" in "polls / url.py". Es wird bereits beurteilt, ob "Umfragen" übereinstimmen, und es wird beurteilt, mit welchem Pfad () der andere Teil übereinstimmt. In diesem Fall stimmt / polls / 34 / nicht mit dem ersten path () von polls / url.py überein.

Was dann mit der zweiten und den nachfolgenden Beschreibungen passiert, schauen wir uns <int: question_id> an. Dies bedeutet, im URL-Muster nach "int" zu suchen und es "question_id" zu nennen.

Aus dem Dokument

Bei spitzen Klammern wird ein Teil der URL "erfasst" und als Schlüsselwortargument an die Ansichtsfunktion gesendet. Der Teil: question_id> der Zeichenfolge definiert den Namen, mit dem das übereinstimmende Muster identifiziert wird, und der Teil <int: ist der Konverter, der das Muster bestimmt, das diesem Teil des URL-Pfads entspricht.

In diesem Fall verlässt der Zugriff "/ polls / 34 /" die Zeichenfolge "34 /", sodass sie mit dem zweiten "path ()" übereinstimmt. Danach wird die Anforderung an die angegebene Ansichtsfunktion übergeben. In diesem Fall wird die Anforderung an die Methode "detail ()" von "polls / views.py" übergeben. Wenn man es betrachtet, werden "request" und "question_id" als Argumente angegeben

detail(request=<HttpRequest object>, question_id=34)

Argumente werden an detail () übergeben und die Methode ausgeführt. Wir werden später prüfen, welche Art der Verarbeitung tatsächlich durchgeführt wird.

Über Vorlagen


   'DIRS': [os.path.join(BASE_DIR, 'templates')],
   'APP_DIRS': True,

Dieser Teil von settings.py ist der Schlüssel. Geben Sie zunächst an, wo die HTML-Vorlage in DIRS abgelegt werden soll. Wenn Sie eine Vorlage für nur eine Anwendung angeben, wird der Name des Anwendungsordners anstelle von "BASE_DIR" eingegeben. Wenn Sie jedoch "BASE_DIR" und dann "APP_DIRS" auf "True" setzen, ist das Unterverzeichnis des oben angegebenen Ordners die App. Sie können festlegen, dass nach dem Namen des Anwendungsordners gesucht und die Vorlage angewendet wird.

Mit anderen Worten, diesmal lautet der Name des Anwendungsordners "polls", sodass das Verzeichnis, in dem die Vorlagen gespeichert werden, "templates / polls" lautet. Die Methode render () kann eine Anforderung als erstes Argument, einen Vorlagennamen als zweites Argument und ein Wörterbuch als drittes Argument angeben. Dann hat es die Aufgabe, ein HttpResponse-Objekt basierend auf dem empfangenen Argument zu erstellen und es zurückzugeben. Es scheint, dass diese Art der Verarbeitung als Rendering bezeichnet wird. Beim Rendern handelt es sich um ein Bild der Verarbeitung, das bestimmte Informationen ausdrückt, indem es in ein Formular umgewandelt wird. In diesem Fall Informationen wie "Anfrage" -Objekte ("Sitzung" und "Get, Post") und "Kontext" (Datenbankdaten) Und die Vorlage HTML-Datei sind gut kombiniert, Es scheint, dass es wie ein Formteil als Browser-Bildschirm verarbeitet wird.

Wenn Sie die Render-Klasse importieren, müssen Sie auch nicht die Loader-Klasse und die HttpResponse-Klasse importieren. Die Klasse "HttpResponse" hat jedoch andere Rollen, sodass es sicher erscheint, sie zu verlassen.

Die nächste Ausnahme ist.


from django.http import Http404
from django.shortcuts import render

from .models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("Question does not exist")
    return render(request, 'polls/detail.html', {'question': question})


Dies ist eine bekannte Form des sogenannten "Try-Catch". Sie können einen 404-Fehler erhalten, indem Sie die Klasse "Http404" aus dem Modul "django.http" importieren. Der Code, der eine Ausnahme auslöst, abhängig davon, ob dem Objekt "Frage" eine "Frage" -Variable zugewiesen ist oder nicht. Um es etwas einfacher auszudrücken, wird eine Ausnahme ausgelöst, wenn die Daten mit der angeforderten ID nicht vorhanden sind. Wie bei der render () Methode, die auch die Rolle von loader und HttpRespose spielte, können Sie präzisere Methoden aus dem django.shortcuts Modul importieren.

from django.shortcuts import get_object_or_404, render

from .models import Question
# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

Durch Angabe des Modellnamens und des Schlüssels in der Methode "get_object_or_404 ()" wird "try-catch" automatisch verarbeitet. Sie können mehrere Schlüssel festlegen, wenn Sie beispielsweise "get_object_or_404 (User, pk = 1, name =" tanaka ") angeben, der Primärschlüssel ist 1 und der Name des Schlüsselschlüssels ist tanaka. Sie erhalten einen 404-Fehler. Übrigens gibt es auch eine Methode namens "get_list_or_404 ()". Es ist eine Methode, um den Wert auf die gleiche Weise aus dem Modell abzurufen, diesmal wird sie jedoch mit der filter () -Methode basierend auf dem angegebenen Schlüssel eingegrenzt und alle mit Liste abgerufen. Wenn Sie beispielsweise wie zuvor "get_list_or_404 (User, pk = 1, name =" tanaka ") angeben, erhalten Sie dann alle Daten mit dem Primärschlüssel 1 und dem Wert des" name "-Schlüssels" tanaka "und geben sie als Liste zurück? Wenn keine vorhanden sind, wird ein 404-Fehler angezeigt.

Über das Vorlagensystem

Es ist ein Vorlagensystem, das auch Laravel war, aber es gibt keinen großen Unterschied beim Schreiben und Verwenden.

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

Bei dieser Beschreibung haben Sie sie möglicherweise nur durch Betrachten bemerkt. Wenn es sich jedoch um "{{}}" und doppelte geschweifte Klammern handelt, handelt es sich um einen variablen Ausdruck. Mit anderen Worten, es drückt die Attribute von Variablen aus, und es wird geschrieben, dass der Teil "question_text" des Objekts "Question" hier eingegeben wird.

Als Prozess

Aus dem Dokument

Das Vorlagensystem verwendet die Punktsuchsyntax, um auf die Attribute von Variablen zuzugreifen. Am Beispiel von {{question.question_text}} führt Django zunächst eine Wörterbuchsuche für das Fragenobjekt durch. Wenn dies fehlschlägt, wird es jetzt als Attribut gesucht und in diesem Fall ist es erfolgreich. Wenn die Attributsuche fehlschlägt, wird der Listenindex durchsucht.

Es bedeutet das. Wie Sie an der Tatsache sehen können, dass dieses Tutorial erstellt wurde, ist der Inhalt der Frage im Tag "h1" enthalten. Daher gibt es mehrere Fragen, und es ist schwierig, jedes Mal eine Vorlage zu erstellen. Wenn Sie also auf diese Weise schreiben und verstehen, dass sich der im Tag "h1" enthaltene Inhalt abhängig vom Inhalt der Frage ändert, ist dies in Ordnung. ..

Als nächstes im Fall einer gewellten Klammer {}. Dies führt einen Methodenaufruf durch.

Die Verarbeitung dieses Mal ist wie folgt.

Aus dem Dokument

Der Methodenaufruf erfolgt in einer {% for%} -Schleife. question.choice_set.all wird im Python-Code als question.choice_set.all () interpretiert. Als Ergebnis wird ein iterierbares Objekt zurückgegeben, das aus Choice-Objekten besteht, die mit dem Tag {% for%} verwendet werden können.

Mit anderen Worten, Sie können so viele "li" -Tags auflisten, wie es "choice.choice_text" -Objekte gibt, die mit dieser Methode erhalten wurden. In diesem Fall ist es ein Ausdruck der Antwort auf den Inhalt der Frage. Es gibt mehrere Möglichkeiten, eine Frage zu beantworten. Es ist also in Ordnung, wenn Sie wissen, dass sie auf diese Weise ausgedrückt wird.

Denken Sie zum Beispiel auch daran, dass Sie "name" früher in "polls.urls" angegeben haben.

path('<int:question_id>/', views.detail, name='detail'),

Es ist so. Wenn Sie es so angeben, müssen Sie den URL-Pfad nicht mithilfe des URL-Tags in der Vorlage schreiben. Zum Beispiel


<li><a href="{% url 'detail' question.id %}">{{ question.question_text }}</a></li>

Es ist eine solche Beschreibung. Normalerweise müssen Sie "URL" oder Pfad im "href" -Attribut des "a" -Tags angeben. Ich habe jedoch im Voraus definiert, dass "Detail" der Name des Pfads "/ polls /" <int: question_id> / "ist. Wenn Sie also wie oben "Detail" schreiben und dann einen "Int-Typ" mit dem Namen "question_id" (question.id hier) eingeben, ist dies ein Pfad. Wenn Sie möchten, dass dieser Pfad wie "polls / specials / 12 /" aussieht, bearbeiten Sie "polls / urls.py".

Namensraum

Endlich der Namespace. Durch Vordefinieren des Namespace in "urls.py" jedes Anwendungsordners wird automatisch festgelegt, welche "URLconf" der Anwendung verwendet werden soll, wenn mehrere Anwendungsordner in einem Projekt verwaltet werden. Ich werde.

polls/urls.py



#Fügen Sie Folgendes hinzu
app_name = 'polls'

Geben Sie dies wie folgt an. Und auf der Vorlagenseite im Teil der Angabe des Namens des URL-Pfads

<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

Ich werde es mit einem Namespace wie diesem angeben. Dies bedeutet, dass der Detailansichtspfad der Umfrage-App hier angezeigt wird.

Referenz

Was ist Rendering überhaupt? [Leicht verständliche Erklärung für Anfänger] Was ist as_view in Djangos klassenbasierter Ansicht?

Recommended Posts

Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 5 ~
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps mit Python ~ Django Tutorial 4 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 1, 2, 3 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 6 ~
Lernverlauf für die Teilnahme an der Team-App-Entwicklung mit Python ~ Django Tutorial 7 ~
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps in Python ~ Indexseite ~
Lernverlauf für die Teilnahme an der Entwicklung von Team-Apps in Python ~ Denken Sie ein wenig über die Definition von Anforderungen nach ~
Lernverlauf für die Teilnahme an der Entwicklung von Teamanwendungen mit Python ~ Ergänzung der Grundelemente und Aufbau der jupyterLab-Umgebung ~
Lernverlauf zur Teilnahme an der Entwicklung von Teamanwendungen mit Python ~ Build Docker / Django / Nginx / MariaDB-Umgebung ~
Lernverlauf zur Teilnahme an der Entwicklung von Teamanwendungen mit Python ~ Nach Abschluss von "Einführung in Python 3" des Paiza-Lernens ~
Python Django Tutorial (2)
Python Django Tutorial (8)
Python Django Tutorial (6)
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Python Django Tutorial (3)
Python Django Tutorial (4)
Boost.NumPy Tutorial zum Erweitern von Python in C ++ (Übung)
[Implementierung zum Lernen] Implementieren Sie Stratified Sampling in Python (1)
Lernnotizen für die Migrationsfunktion im Django-Framework (2)
Zusammenfassung des Python Django-Tutorials
Erstellen Sie mit Python eine interaktive Umgebung für maschinelles Lernen
Verzeichnisstruktur für die testgetriebene Entwicklung mit pytest in python
App-Entwicklung zum Twittern in Python aus Visual Studio 2017
Lernnotizen für die Migrationsfunktion im Django-Framework (3)
Lernnotizen für die Migrationsfunktion im Django-Framework (1)
Tiefes Lernen mit Python Kapitel 2 (Material für runde Vorlesung)
Framework-Entwicklung mit Python
Entwicklungsumgebung in Python
Entwicklung des AWS SDK für Python (Boto3) in Visual Studio 2017
Slackbot-Entwicklung in Python
Tutorial für die testgetriebene Entwicklung (TDD) mit Flask-1 Test Client Edition
Lernablauf für Python-Anfänger
Python-Lernplan für KI-Lernen
Techniken zum Sortieren in Python
Python-Entwicklung mit Visual Studio 2017
Qt für Python App Selbstaktualisierung
Python Django Tutorial Cheet Sheet
Checkios Empfehlung zum Erlernen von Python
[Zum Organisieren] Python-Entwicklungsumgebung
Python-Entwicklung mit Visual Studio
Über "für _ in range ():" von Python
Wie wäre es mit Anaconda zum Erstellen einer maschinellen Lernumgebung mit Python?
Ändern Sie automatisch die Größe von Screenshots für den App Store für jeden Bildschirm in Python
Gehirnwellenanalyse mit Python: Python MNE-Tutorial
Implementieren Sie das Stacking-Lernen in Python [Kaggle]
Suchen Sie mit Python nach externen Befehlen
8 häufig verwendete Befehle in Python Django
Web-Lehrmaterialien zum Erlernen von Python
[Für Anfänger] Django -Entwicklungsumgebung Bau-
Optionen für die Python-Entwicklungsumgebung für Mai 2020
<Für Anfänger> Python-Bibliothek <Für maschinelles Lernen>
Emacs-Einstellungen für die Python-Entwicklungsumgebung
Python: Vorverarbeitung beim maschinellen Lernen: Übersicht
Implementierte Perceptron-Lernregeln in Python
Führen Sie unittest in Python aus (für Anfänger)
Bereiten Sie eine Python-Entwicklungsumgebung für jedes Projekt in einer Windows-Umgebung vor (VSCode + virtualEnvWrapper + Pylint).
Entwicklung der MTG Card Evaluation Posting Site ~ Veröffentlichung der Django App in 5 Wochen ~