

**前提・実現したいこと**  
Djangoのチュートリアルに取り組んでいます。投票アプリケーションを作成するために以下のサイトを参照しています。

<https://docs.djangoproject.com/ja/4.0/intro/tutorial04/>

無投票の場合にはエラーページが表示されるはずなのですが表示されません。

**該当のソースコード**  
polls/views.py

[code]

    from django.http import HttpResponse
    from django.shortcuts import get_object_or_404, render
    from django.urls import reverse
    
    from .models import Choice, 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):
        question = get_object_or_404(Question, pk=question_id)
        return render(request, 'polls/detail.html', {'question': question})
    
    def results(request, question_id):
        question = get_object_or_404(Question, pk=question_id)
        return render(request, 'polls/results.html', {'question': 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):
            return render(request, 'polls/detail.html', {
                'question': question,
                'error_message': "You didn't select a choice.",
            })
        else:
            selected_choice.votes += 1
            selected_choice.save()
            return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))
    
[/code]

polls/urls.py

[code]

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

polls/template/polls/index.html

[code]

    {% if latest_question_list %}
        <ul>
        {% for question in latest_question_list %}
            <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
        </ul>
    {% else %}
        <p>No polls are available.</p>
    {% endif %}
    
[/code]

polls/template/polls/detail.html

[code]

    <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>
    
[/code]

polls/template/polls/results.html

[code]

    <h1>{{ question.question_text }}</h1>
    
    <ul>
    {% for choice in question.choice_set.all %}
        <li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
    {% endfor %}
    </ul>
    
    <a href="{% url 'polls:detail' question.id %}">Vote again?</a>
    
[/code]


CC BY-SA 4.0
2022-05-12T15:41:04.663
88790
2022-05-13T06:18:11.733
2022-05-13T03:50:43.667
52539
52539
question
python django
無投票なのにエラーページが表示されない


とりあえず以下のようなものでしょうか、作業漏れと古い記事をコピペした結果のようですね。  
こうしたちょっとした漏れやミスが問題につながりますので、よくチェックするようにしてください。

* * *

polls/views.py:最初の行の import が不足しています。  
誤：

[code]

    from django.http import HttpResponse
    
[/code]

正：

[code]

    from django.http import HttpResponse, HttpResponseRedirect
    
[/code]

* * *

polls/template/polls/index.html:Tutorialの前のページでの入力に不足(`{% endfor %}`)があります。  
誤：

[code]

        <ul>
        {% for question in latest_question_list %}
            <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
        </ul>
    
[/code]

正：

[code]

        <ul>
        {% for question in latest_question_list %}
            <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
        {% endfor %}
        </ul>
    
[/code]

* * *

polls/template/polls/detail.html:コメントで紹介した古い版のTutorialで作業した記事の内容が使われています。  
誤：

[code]

    <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>
    
[/code]

正：

[code]

    <form action="{% url 'polls:vote' question.id %}" method="post">
    {% csrf_token %}
    <fieldset>
        <legend><h1>{{ question.question_text }}</h1></legend>
        {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
        {% 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 %}
    </fieldset>
    <input type="submit" value="Vote">
    </form>
    
[/code]


CC BY-SA 4.0
2022-05-13T06:07:07.420
88798
2022-05-13T06:18:11.733
2022-05-13T06:18:11.733
26370
26370
88790
answer