Offizielles Tutorial zu Django, dem Webframework für Python "Erstellen Ihrer ersten Django-App" Dies ist ein Memo von 1 bis 5.
Es ist wirklich nur ein Memo.
Klicken Sie hier für die ursprüngliche Website https://docs.djangoproject.com/ja/3.1/intro/tutorial01/
Erstellen Sie eine Python-Umgebung und geben Sie mit pip ein
terminal
pip install django
Ich werde prüfen, ob es enthalten ist
terminal
$ python -m django --version
3.1.2
Es scheint, dass Django 3.1.2 enthalten ist
Wenn Sie django-admin startproject hoge ausführen, werden automatisch die minimal erforderlichen Ordner und Dateien für Ihr Projekt erstellt.
terminal
django-admin startproject mysite
Die erstellte Datei hat die folgende Struktur
Verzeichnisaufbau
mysite/
manage.py
mysite/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
DB ist Python-Standard sqlite3.
Derzeit kann die Beispielseite in diesem Zustand angezeigt werden. Probieren Sie es also aus. Durch Ausführen von manage.py run server wird ein einfacher Server für die Entwicklung gestartet.
terminal
python manage.py runserver
Da der gestartete Server auf Port 8000 des lokalen Hosts wartet, ist zu sehen, dass die folgende URL im Browser geöffnet ist. http://127.0.0.1:8000
Da dieser einfache Server nur für die Verwendung während der Entwicklung vorgesehen ist, wird im offiziellen Lernprogramm geschrieben, dass er niemals in einer Produktionsumgebung verwendet werden darf. Lassen Sie uns in einer Produktionsumgebung mit Apache usw. veröffentlichen.
Mit Django können Sie mit mehreren Anwendungen arbeiten. Wenn Sie Folgendes ausführen, werden die für die Anwendung mindestens erforderlichen Dateien automatisch generiert.
terminal
python manage.py startapp polls
Verzeichnisaufbau
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
Sie können so viele Apps erstellen, wie Sie möchten. Wenn Sie sie also gut nach Funktionen aufteilen, sind Sie produktiver.
view ist in views.py geschrieben.
Die folgende Ansicht gibt "Hallo, Welt. Sie befinden sich im Umfrageindex" zurück. Auf http, wenn Sie /polls/index.html lesen.
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
Ich werde die Zuordnung zu den oben genannten views.py in urls.py schreiben.
Wenn Sie es in django.urls.path () schreiben, wird es zugeordnet. Wenn Sie wie folgt schreiben, finden Sie index () in polls / views.py, indem Sie in dieser Reihenfolge auf mysite / urls.py → polls / urls.py → polls / views.py verweisen.
mysite/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
polls/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
Nachdem wir es zugeordnet haben, starten wir den einfachen Server und überprüfen ihn.
terminal
python manage.py runserver
Der in polls / views.py geschriebene Inhalt wartet in der URL auf Sie. http://localhost:8000/polls/
Standardmäßig wird sqlite3 verwendet, sodass Sie dies tun können, ohne eine Datenbank festzulegen. Ich denke, dass es in der Produktion in postgreSQL oder mySQL geändert wird. In diesem Fall wird auf Folgendes verwiesen. https://docs.djangoproject.com/ja/3.1/intro/tutorial02/
Der Standard wird in UTC festgelegt
mysite/setting.Vor dem py wechseln
TIME_ZONE = 'UTC'
Wenn Sie die japanische Standardzeit verwenden möchten, ändern Sie dies wie folgt
mysite/setting.Nach dem Wechsel von py
TIME_ZONE = 'Asia/Tokyo'
USE_TZ = True
Erstellen Sie eine Datenbank basierend auf dem Inhalt von settings.py
terminal
python manage.py migrate
Da Django DB-Daten als Objekt behandelt, scheint die Datenverarbeitung einfacher zu sein. (Ich bin mir zu diesem Zeitpunkt nicht sicher.)
polls/models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
def __str__(self):
return self.question_text
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)
def __str__(self):
return self.choice_text
setting.py
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Machen Sie Django darauf aufmerksam, dass sich das Modell geändert hat
terminal
python manage.py makemigrations polls
django wurde entwickelt, um produktiver zu sein, indem eine ordentliche Verzeichnisstruktur erzwungen wird. Es hat jedoch das Problem komplizierter Dateiverbindungen und die Schwierigkeit zu sehen, was passiert, wenn Sie eine Funktion von django aus ausführen. Die Django-Shell wird bereitgestellt, um die Überprüfung zu vereinfachen, und kann mit der Python-Datei manage.py ausgeführt werden.
django_shell
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet []>
django_shell
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save()
django_shell
>>> q.id
1
django_shell
>>> q.question_text = "What's up?"
>>> q.save()
django_shell
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
django_shell
>>> q.question_text
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
django_shell
python manage.py shell
In [1]:
django_shell
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
django_shell
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
django_shell
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>
django_shell
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>
django_shell
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
django_shell
>>> Question.objects.get(pk=1)
<Question: What's up?>
django_shell
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
django_shell
>>> q = Question.objects.get(pk=1)
>>> q.choice_set.all()
<QuerySet []>
django_shell
>>> q.choice_set.create(choice_text='Not much', votes=0)
>>> q.choice_set.create(choice_text='The sky', votes=0)
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
>>> c.question
<Question: What's up?>
django_shell
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
django_shell
>>> q.choice_set.count()
3
django_shell
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
django_shell
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
Erstellen Sie einen Superuser für die Django-Projektüberwachung. Dieser Superuser ist für Django und daher vom Linux-Benutzer getrennt.
django_shell
python manage.py createsuperuser
Geben Sie Ihre ID und Ihr Passwort ein, um die Registrierung abzuschließen. Auf diese Weise können Sie sich auf der Administrationsseite anmelden. Starten Sie also den einfachen Server und melden Sie sich auf der Administrationsseite an.
django_shell
python manage.py runserver
URL der Administrationsseite http://127.0.0.1:8000/admin/ Wenn Sie sich anmelden, sehen Sie Folgendes
polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
Spalten für die Umfrage-App wie unten hinzugefügt
Klicken Sie auf Fragen, um mit den Werten im Objekt zu arbeiten
Ich möchte es gut verwenden, weil es einfacher zu verstehen ist, als von der Shell aus zu arbeiten.
Erstellen Ihrer ersten Django-App, Teil 3 https://docs.djangoproject.com/ja/3.1/intro/tutorial03/
polls/views.py
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
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
urlpatterns = [
# ex: /polls/
path('', views.index, name='index'),
# ex: /polls/5/
path('<int:question_id>/', views.detail, name='detail'),
# ex: /polls/5/results/
path('<int:question_id>/results/', views.results, name='results'),
# ex: /polls/5/vote/
path('<int:question_id>/vote/', views.vote, name='vote'),
]
Wenn Sie jetzt den Runserver python manage.py und die folgende URL in Ihrem Browser öffnen, werden detail (), results () und vote () in polls / views.py ausgeführt. http://127.0.0.1:8000/polls/34/ http://127.0.0.1:8000/polls/34/results/ http://127.0.0.1:8000/polls/34/vote/
Schreiben Sie den Index () von polls / views.py wie folgt um und stellen Sie eine Frage.
polls/vies.py
from django.http import HttpResponse
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
output = ', '.join([q.question_text for q in latest_question_list])
return HttpResponse(output)
def detail(request, question_id):
return HttpResponse("You're looking at question %s." % question_id)
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)
Oben ist das Bildschirmlayout direkt in views.py geschrieben, aber lassen Sie uns die Beschreibung in der Vorlage trennen, damit sie leicht geändert werden kann. Schreiben Sie loader.get_template ('polls / index.html') in views.py, um template / polls / index.html zu lesen.
polls/views.py
from django.http import HttpResponse
from django.template import loader
from .models import Question
def index(request):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
template = loader.get_template('polls/index.html')
context = {
'latest_question_list': latest_question_list,
}
return HttpResponse(template.render(context, request))
polls/templates/polls/index.html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
render
Wenn Sie das Lesen und Rendern der Vorlage durch render () ersetzen, können Sie es kurz schreiben und weniger Pakete importieren.
polls/views.py
from django.shortcuts import render
from .models import Question
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)
Bewirkt, dass ein 404 ausgegeben wird, wenn mit try / exception eine Ausnahme auftritt.
polls/views.py
from django.http import Http404
from django.shortcuts import render
from .models import Question
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/detail.html', {'question': question})
get_object_or_404
Es ist mühsam, jedes Mal zu versuchen / auszuschließen, daher werde ich es durch get_object_or_404 () ersetzen, eine Funktion, die 404 zurückgibt, wenn sie fehlschlägt.
python
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})
Wenn Sie app_name in polls / urls.py angeben, können Sie im Namespace der App darauf verweisen. Wenn Sie dies nicht tun, ist der Vorgang verdächtig, wenn in einer anderen Anwendung eine Ansicht mit demselben Namen vorhanden ist. Ich denke, es ist besser, sie beim Erstellen einer Ansicht anzugeben, ohne dies zu vergessen.
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/', views.vote, name='vote'),
]
Dadurch wird die Ansichtsreferenz von Detail zu Umfragen geändert: Detail. Geben Sie andere Ansichten als Umfragen an: hoge auch.
polls/templates/polls/index.html
{% if latest_question_list %}
<ul>
{% for question in latest_question_list %}
<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
{% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}
Erstellen Ihrer ersten Django-App, Teil 4 https://docs.djangoproject.com/ja/3.1/intro/tutorial04/
Fügen Sie eine Abstimmungsschaltfläche hinzu
polls/detail.html
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}">
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br>
{% endfor %}
<input type="submit" value="Vote">
</form>
Sie können eine Schaltfläche wie diese erstellen http://127.0.0.1:8000/polls/1/ Da die Aktion des Formulars auf "In der Ansicht von Umfragen posten: Abstimmung" eingestellt ist, erstellen Sie eine entsprechende Ansicht.
Die Ansicht von Polls: Vote wird wie folgt in polls / urls.py geschrieben, sodass Sie sie in polls / views.py schreiben können.
polls/urls.py
path('<int:question_id>/vote/', views.vote, name='vote'),
Fügen Sie eines der ausgewählten Ziele hinzu und leiten Sie zu / polls / results / um
polls/views.py
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from .models import Choice, Question
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
# Redisplay the question voting form.
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
# Always return an HttpResponseRedirect after successfully dealing
# with POST data. This prevents data from being posted twice if a
# user hits the Back button.
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
Ich werde auch eine Ansicht von / polls / results / schreiben, die von redirect aufgerufen wird
python
from django.shortcuts import get_object_or_404, render
def results(request, question_id):
question = get_object_or_404(Question, pk=question_id)
return render(request, 'polls/results.html', {'question': question})
Es scheint, dass nutzlose Beschreibungen durch Verwendung einer Allzweckansicht reduziert werden können.
polls/urls.py
from django.urls import path
from . import views
app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
]
polls/views.py
from django.http import HttpResponseRedirect
from django.shortcuts import get_object_or_404, render
from django.urls import reverse
from django.views import generic
from .models import Choice, Question
class IndexView(generic.ListView):
template_name = 'polls/index.html'
context_object_name = 'latest_question_list'
def get_queryset(self):
"""Return the last five published questions."""
return Question.objects.order_by('-pub_date')[:5]
class DetailView(generic.DetailView):
model = Question
template_name = 'polls/detail.html'
class ResultsView(generic.DetailView):
model = Question
template_name = 'polls/results.html'
Es geht immer noch weiter https://docs.djangoproject.com/ja/3.1/intro/tutorial05/
Recommended Posts