[PYTHON] mémo du didacticiel django

Tutoriel officiel sur Django, le framework web pour python "Création de votre première application Django" Ceci est un mémo de 1 à 5.

C'est vraiment juste un mémo.

Cliquez ici pour le site Web original https://docs.djangoproject.com/ja/3.1/intro/tutorial01/

1. Installation

Créez un environnement python et entrez avec pip

terminal


pip install django

Je vérifierai si c'est inclus

terminal


$ python -m django --version
3.1.2

Il semble que django 3.1.2 soit inclus

2. Créez un projet Django

Lorsque vous exécutez django-admin startproject hoge, il crée automatiquement les dossiers et fichiers minimum requis pour votre projet.

terminal


django-admin startproject mysite

Le fichier créé a la structure suivante

Structure du répertoire


mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

DB est le standard python sqlite3.

Pour le moment, l'exemple de page peut être affiché dans cet état, alors essayons-le. L'exécution de manage.py run server démarrera un serveur simple pour le développement.

terminal


python manage.py runserver

Puisque le serveur démarré attend sur le port 8000 de l'hôte local, vous pouvez voir que vous pouvez ouvrir l'URL suivante avec un navigateur. http://127.0.0.1:8000 image.png

De plus, comme ce serveur simple est conçu uniquement pour être utilisé pendant le développement, il est écrit dans le tutoriel officiel que "Ne jamais l'utiliser dans un environnement de production". Dans un environnement de production, publions avec Apache, etc.

3. Créez une application dans le projet

Django vous permet de travailler avec plusieurs applications. Si vous exécutez comme suit, les fichiers minimum requis pour l'application seront automatiquement générés.

terminal


python manage.py startapp polls

Structure du répertoire


polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py

Vous pouvez créer autant d'applications que vous le souhaitez, donc si vous les divisez bien par fonction, vous serez plus productif.

4.Faites une vue de l'application de sondages

view est écrit dans views.py.

Ce qui suit est une vue qui renvoie "Bonjour, tout le monde. Vous êtes à l'index des sondages." Sur http lorsque vous venez de lire /polls/index.html.

polls/views.py


from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

J'écrirai l'association dans le fichier views.py ci-dessus dans urls.py.

Si vous l'écrivez dans django.urls.path (), il sera associé. Si vous écrivez comme suit, vous trouverez index () dans polls / views.py en vous référant à mysite / urls.py → polls / urls.py → polls / views.py dans cet ordre.

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'),
]

Maintenant que nous l'avons associé, démarrons le serveur simple et vérifions-le.

terminal


python manage.py runserver

Le contenu écrit dans polls / views.py vous attendra dans l'url. http://localhost:8000/polls/

5. Changement de base de données

Par défaut, sqlite3 est utilisé, vous pouvez donc le faire sans définir de base de données. Je pense qu'il sera changé en postgreSQL ou mySQL en production, donc dans ce cas, reportez-vous à ce qui suit. https://docs.djangoproject.com/ja/3.1/intro/tutorial02/

6. Réglage de TIME_ZONE

La norme est définie en UTC

mysite/setting.Avant de changer py


TIME_ZONE = 'UTC'

Si vous souhaitez utiliser l'heure standard japonaise, modifiez comme suit

mysite/setting.Après avoir changé py


TIME_ZONE = 'Asia/Tokyo'
USE_TZ = True

7. migrer

Construisez une base de données basée sur le contenu de setting.py

terminal


python manage.py migrate

Puisque django traite les données de base de données comme un objet, il semble que la gestion des données sera plus facile. (Je ne suis pas sûr à ce stade.)

8. Faire un modèle

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',
]

Faire savoir à Django que le modèle a changé

terminal


python manage.py makemigrations polls

9. Utilisez le shell django

Bien que django soit conçu pour être plus productif en forçant une structure de répertoires ordonnée, il a le problème des connexions de fichiers compliquées et la difficulté de voir ce qui se passe lorsque vous exécutez une fonction à partir de django. Le shell django est fourni pour faciliter la vérification, et peut être exécuté avec le shell python manage.py.

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. Créer un utilisateur superviseur

Créez un superutilisateur pour la supervision du projet django. Ce superutilisateur est pour django, il est donc distinct de l'utilisateur du système d'exploitation Linux.

django_shell


python manage.py createsuperuser

Entrez votre identifiant et votre mot de passe pour terminer l'enregistrement. Cela vous permettra de vous connecter à la page d'administration, alors démarrez le serveur simple et connectez-vous à la page d'administration.

django_shell


python manage.py runserver

URL de la page d'administration http://127.0.0.1:8000/admin/ admin01.png Lorsque vous vous connectez, vous verrez ce qui suit admin02.png

11. Modifiez l'application depuis la page d'administration

polls/admin.py


from django.contrib import admin
from .models import Question

admin.site.register(Question)

Une colonne pour l'application de sondages a été ajoutée comme indiqué ci-dessous admin03t.png

Cliquez sur Questions pour travailler avec les valeurs de l'objet image.png

Je veux bien l'utiliser car il est plus facile à comprendre que de fonctionner depuis le shell.

12. Ajouter une vue

Création de votre première application Django, partie 3 https://docs.djangoproject.com/ja/3.1/intro/tutorial03/

Changer la vue pour ouvrir en fonction de l'URL

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'),
]

Désormais, lorsque vous ouvrez python manage.py runserver et l'URL suivante dans votre navigateur, detail (), results () et vote () dans polls / views.py seront exécutés respectivement. 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/

Créer une page d'index

Réécrivez l'index () de polls / views.py comme suit et posez la question.

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. Créer un modèle

Dans ce qui précède, la disposition de l'écran est écrite directement dans views.py, mais séparons la description dans le modèle afin qu'elle puisse être facilement modifiée. Écrivez loader.get_template ('polls / index.html') dans views.py pour lire template / polls / index.html.

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

Si vous remplacez le modèle de lecture et de rendu par render (), vous pouvez l'écrire court et vous pouvez importer moins de packages.

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. Affichage d'erreur 404

Provoque l'émission d'un 404 lorsqu'une exception se produit avec try / except.

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

Il est difficile d'essayer / d'exclure à chaque fois, donc je vais le remplacer par get_object_or_404 () qui est une fonction qui renvoie 404 en cas d'échec.

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. Espace de noms de l'application

Si vous spécifiez app_name dans polls / urls.py, vous pouvez y faire référence à partir de l'espace de noms de l'application. Si vous ne le faites pas, l'opération sera suspecte lorsqu'il y a une vue avec le même nom dans une autre application, donc je pense qu'il vaut mieux la spécifier lors de la création d'une vue sans oublier.

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'),
]

Cela changera la référence de vue de détail à sondages: détail. Spécifiez à nouveau les autres vues comme sondages: hoge également.

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. Rédigez un formulaire

Création de votre première application Django, partie 4 https://docs.djangoproject.com/ja/3.1/intro/tutorial04/

Ajouter un bouton de vote

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>

Vous pouvez créer un bouton comme celui-ci http://127.0.0.1:8000/polls/1/ image.png Puisque l'action du formulaire est paramétrée sur "publier dans la vue des sondages: vote", créez une vue correspondant à cela.

La vue des sondages: vote est écrite dans polls / urls.py comme suit, vous pouvez donc l'écrire dans polls / views.py.

polls/urls.py


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

Ajoutez l'une des cibles sélectionnées et redirigez vers / polls / results /

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

J'écrirai également une vue de / polls / results / appelée par redirection

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. Utiliser une vue générique

Il semble que les descriptions inutiles peuvent être réduites en utilisant une vue à usage général.

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'

Ça continue encore https://docs.djangoproject.com/ja/3.1/intro/tutorial05/

Recommended Posts

mémo du didacticiel django
Tutoriel Python Django (5)
Tutoriel Python Django (2)
Tutoriel Python Django (8)
Tutoriel Python Django (6)
Démarrer le didacticiel Django 1
Tutoriel Python Django (7)
Tutoriel Python Django (1)
Tutoriel du didacticiel Python Django
Tutoriel Python Django (3)
Tutoriel Python Django (4)
Résumé du didacticiel Python Django
mémo de déploiement heroku (Django)
Didacticiel sur les associations polymorphes Django
tutoriel simple django oscar
Django memo n ° 1 à partir de zéro
Mémo du didacticiel Python OpenCV
Mémo du didacticiel FastAPI, partie 1
Note du didacticiel Django Girls
[Memo] Environnement de développement Django
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
mémo tutoriel pyramide (compte bancaire)
Mémo de construction de l'environnement de développement Django
Lancez-vous avec Django! ~ Tutoriel ④ ~
Django
Lancez-vous avec Django! ~ Tutoriel ⑥ ~
Fiche technique du didacticiel Python Django
[Mémo d'apprentissage] Résumé de la commande Django
Mémo inversé de l'écran de gestion Django
[Mémo Django] Échec lors de l'installation de modal
DJango Memo: Depuis le début (préparation)
Résumé du didacticiel Django Girls Première moitié
Paramètres de requête FastAPI Tutorial Memo Part 3
Trébucher lors du didacticiel django 1.7
Déployer le didacticiel Django sur IIS ①
Paramètres de chemin du mémo du didacticiel FastAPI Partie 2
Tutoriel Django Crispy (Construction d'environnement sur Mac)
mémo gzip
Mémo Raspberry-pi
mise à jour de Django
Django Note 4
Mémo Pandas
didacticiel sqlalchemy
DJango Memo: depuis le début (réglage du modèle)
Mémorandum Django
recherche django
Mémo HackerRank
Installation de Django
Mémo Python
Résumé de Django
Test Django
mémo python
Mémo d'enregistrement d'informations en utilisant la session dans Django
mémo graphène
Mémo du flacon
mémo pyenv
Mémo Matplotlib
mémo pytest
Mémo Python
Installer Memo
Réagir → Ajax → Django sur les notes d'implémentation Linux