親です。

子ども産まれたんで育児とかについて書きます。映画とか心理学とかITとかの趣味についても書きます。

【Python】Django公式チュートリアルで湧いた疑問のまとめ

どもです。

Djangoの公式ドキュメントがかなり良い

Djangoは公式ドキュメントがかなり良い。前々から聞いてはいたけど、実際やって見たらすごくよかった。ただ一部よくわからんところがあったのでその点についてまとめておく。

対象のソース

# views.py
# 略

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):
        return render(request, 'polls/detail.html', {'question': question,
                                                     'error_message': "You didn't select a choice.",
                                                     })
    else:
        print(selected_choice)
        selected_choice.vote += 1
        selected_choice.save()
        return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
# models.py
import datetime

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

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)
    vote = models.IntegerField(default=0)

    def __str__(self):
        return self.choice_text
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>detail</title>
</head>
<body>

<h1>Question!!!</h1>
<h2>{{ question.question_text }}</h2>
    {% 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>
</body>
</html>

疑問

①def vote(request, question_id):
疑問:question_idにはどんな値が入ってくるのか?
答え:HTMLに次の記述がある。
{% url 'polls:vote' question.id %}
これのquestion.idが入る。Django側がうまいことやってそうしてくれる。ちなみにquestion.idについて、questionにはidなんてプロパティをセットしたつもりはないんだが、これもDjango側で勝手にやってくれている。

②selected_choice = question.choice_set.get(pk=request.POST['choice'])
疑問:choice_setって何?
答え:Django側が勝手にやってくれている。questionとchoiceはリレーションが貼られており、そういう時に勝手にやってくれるらしい。

③selected_choice = question.choice_set.get(pk=request.POST['choice'])
疑問:request.POST['choice']
答え:HTMLに次の記述。

<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />

ここのname属性とvalue属性で辞書を作り、POSTとして渡している。つまり、choice.idがくるってこと。

<form action="{% url 'polls:vote' question.id %}" method='post'>

疑問:これなんて意味のコード?
答え:action以下のurlにPOSTのリクエストを送っている。POSTの内容はform内の
inputタグで指定されている。

<input type="radio" name="choice" <b>id="choice{{ forloop.counter }}"</b> value="{{ choice.id }}" />

疑問:id="choice{{ forloop.counter }}"って何?
id属性はHTMLテキスト一般に対してつけられるやつ。CSSの指定とかに使う。今回は


以上!