From 485e78a6e2159b746212fb90ead7f6d61b44bab7 Mon Sep 17 00:00:00 2001 From: pedrolab <531310-pedrolab@users.noreply.gitlab.com> Date: Mon, 20 Jul 2020 02:09:01 +0200 Subject: [PATCH] django tutorial #4 completed --- .../mysite/polls/templates/polls/detail.html | 12 ++- .../mysite/polls/templates/polls/results.html | 9 +++ pedro/django-tutorial/mysite/polls/urls.py | 7 +- pedro/django-tutorial/mysite/polls/views.py | 79 +++++++++++++++---- 4 files changed, 84 insertions(+), 23 deletions(-) create mode 100644 pedro/django-tutorial/mysite/polls/templates/polls/results.html diff --git a/pedro/django-tutorial/mysite/polls/templates/polls/detail.html b/pedro/django-tutorial/mysite/polls/templates/polls/detail.html index 975db2a..3e55544 100644 --- a/pedro/django-tutorial/mysite/polls/templates/polls/detail.html +++ b/pedro/django-tutorial/mysite/polls/templates/polls/detail.html @@ -1,6 +1,12 @@

{{ question.question_text }}

- + + diff --git a/pedro/django-tutorial/mysite/polls/templates/polls/results.html b/pedro/django-tutorial/mysite/polls/templates/polls/results.html new file mode 100644 index 0000000..bc78e2b --- /dev/null +++ b/pedro/django-tutorial/mysite/polls/templates/polls/results.html @@ -0,0 +1,9 @@ +

{{ question.question_text }}

+ + + +Vote again? diff --git a/pedro/django-tutorial/mysite/polls/urls.py b/pedro/django-tutorial/mysite/polls/urls.py index 3e302ea..8aa1a75 100644 --- a/pedro/django-tutorial/mysite/polls/urls.py +++ b/pedro/django-tutorial/mysite/polls/urls.py @@ -6,11 +6,12 @@ from . import views app_name = 'polls' urlpatterns = [ # ex: /polls/ - path('', views.index, name='index'), + #path('', views.index, name='index'), + path('', views.IndexView.as_view(), name='index'), # ex: /polls/5/ - path('/', views.detail, name='detail'), + path('/', views.DetailView.as_view(), name='detail'), # ex: /polls/5/results/ - path('/results/', views.results, name='results'), + path('/results/', views.ResultsView.as_view(), name='results'), # ex: /polls/5/vote/ path('/vote/', views.vote, name='vote'), ] diff --git a/pedro/django-tutorial/mysite/polls/views.py b/pedro/django-tutorial/mysite/polls/views.py index 257fe14..e9b70d9 100644 --- a/pedro/django-tutorial/mysite/polls/views.py +++ b/pedro/django-tutorial/mysite/polls/views.py @@ -2,10 +2,12 @@ from django.shortcuts import get_object_or_404, render # Create your views here. -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseRedirect from django.template import loader +from django.urls import reverse +from django.views import generic -from .models import Question +from .models import Choice, Question from django.http import Http404 @@ -30,12 +32,20 @@ from django.http import Http404 ## meaningful, templated and easy to write index ## and then we no longer need to import loader and HttpResponse -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 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) + +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] ## simple detail #def detail(request, question_id): @@ -50,13 +60,48 @@ def index(request): # return render(request, 'polls/detail.html', {'question': question}) ## meaningful and easy to write detail -def detail(request, question_id): +#def detail(request, question_id): +# question = get_object_or_404(Question, pk=question_id) +# return render(request, 'polls/detail.html', {'question': question}) + +## refactor detail view +class DetailView(generic.DetailView): + model = Question + template_name = 'polls/detail.html' + +#def results(request, question_id): +# response = "You're looking at the results of question %s." +# return HttpResponse(response % question_id) + +# # real implementation of results +#def results(request, question_id): +# question = get_object_or_404(Question, pk=question_id) +# return render(request, 'polls/results.html', {'question': question}) + +# # refactor results view +class ResultsView(generic.DetailView): + model = Question + template_name = 'polls/results.html' + +#def vote(request, question_id): +# return HttpResponse("You're voting on question %s." % question_id) + + +# #real implementation of vote +def vote (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): - 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) + 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,)))