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/
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
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
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.
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.
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/
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/
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
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.)
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
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()
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/ Lorsque vous vous connectez, vous verrez ce qui suit
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
Cliquez sur Questions pour travailler avec les valeurs de l'objet
Je veux bien l'utiliser car il est plus facile à comprendre que de fonctionner depuis le shell.
Création de votre première application Django, partie 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'),
]
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/
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)
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)
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})
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 %}
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/ 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})
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