[PYTHON] Django Tutorial Memo

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/

1. Installation

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

2. Erstellen Sie ein Django-Projekt

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 image.png

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.

3. Erstellen Sie eine Anwendung im Projekt

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.

4. Zeigen Sie die Umfrage-App an

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/

5. DB-Änderung

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/

6. TIME_ZONE einstellen

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

7. migrieren

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.)

8. Machen Sie ein Modell

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

9. Verwenden Sie die Django-Shell

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()

10. Erstellen Sie einen überwachenden Benutzer

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/ admin01.png Wenn Sie sich anmelden, sehen Sie Folgendes admin02.png

11. Bearbeiten Sie die App auf der Administrationsseite

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 admin03t.png

Klicken Sie auf Fragen, um mit den Werten im Objekt zu arbeiten image.png

Ich möchte es gut verwenden, weil es einfacher zu verstehen ist, als von der Shell aus zu arbeiten.

12. Ansicht hinzufügen

Erstellen Ihrer ersten Django-App, Teil 3 https://docs.djangoproject.com/ja/3.1/intro/tutorial03/

Ändern Sie die Ansicht so, dass sie abhängig von der URL geöffnet wird

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/

Erstellen Sie eine Indexseite

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)

13. Erstellen Sie eine Vorlage

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)

14. 404 Fehleranzeige

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})

15. App-Namespace

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 %}

16. Schreiben Sie ein Formular

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/ image.png 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})

17. Verwenden Sie eine generische Ansicht

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

Django Tutorial Memo
Python Django Tutorial (5)
Python Django Tutorial (2)
Python Django Tutorial (8)
Python Django Tutorial (6)
Starten Sie das Django Tutorial 1
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Python Django Tutorial (3)
Python Django Tutorial (4)
Zusammenfassung des Python Django-Tutorials
Heroku-Einsatznotiz (Django)
Django Polymorphic Associations Tutorial
Django Oscar einfaches Tutorial
Django Memo # 1 von Grund auf neu
Python OpenCV Tutorial Memo
FastAPI Tutorial Memo Teil 1
Django Girls Tutorial Hinweis
[Memo] Django-Entwicklungsumgebung
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
Pyramide Tutorial Memo (Bankkonto)
Django Entwicklungsumgebung Bau Memo
Fangen Sie mit Django an! ~ Tutorial ④ ~
Django
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Python Django Tutorial Cheet Sheet
[Lernnotiz] Zusammenfassung des Django-Befehls
Django Management Screen Reverse Memo
[Django-Memo] Fehler bei der Installation von Modal
DJango Memo: Von Anfang an (Vorbereitung)
Django Girls Tutorial Zusammenfassung Erste Hälfte
FastAPI Tutorial Memo Teil 3 Abfrageparameter
Stolpern Sie beim Django 1.7-Tutorial
Stellen Sie das Django-Lernprogramm für IIS bereit ①
FastAPI Tutorial Memo Teil 2 Pfadparameter
Django Crispy Tutorial (Umgebungskonstruktion auf Mac)
gzip memo
Himbeer-Pi-Memo
Django-Update
Django Note 4
Pandas Memo
sqlalchemy Tutorial
DJango Memo: Von Anfang an (Modelleinstellung)
Django Memorandum
Django-Suche
HackerRank-Memo
Django Installation
Python-Memo
Django Zusammenfassung
Django-Test
Python-Memo
Memo zur Informationsaufzeichnung mit Sitzung in Django
Graphen-Memo
Kolben Memo
pyenv memo
Matplotlib-Memo
pytest memo
Python-Memo
Installieren Sie Memo
Reagieren Sie → Ajax → Django auf Linux-Implementierungshinweise