from django.shortcuts import get_object_or_404, render # Create your views here. from django.http import HttpResponse, HttpResponseRedirect from django.template import loader from django.urls import reverse from django.views import generic from .models import Choice, Question from django.http import Http404 from django.utils import timezone ## simple index #def index(request): # return HttpResponse("Hello, world. You're at the polls index.") ## meaningful index #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) ## meaningful and templated index #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)) ## 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) class IndexView(generic.ListView): template_name = 'polls/index.html' context_object_name = 'latest_question_list' ## has bug # def get_queryset(self): # """Return the last five published questions.""" # return Question.objects.order_by('-pub_date')[:5] # refactor def get_queryset(self): """ Return the last five published questions (not including those set to be published in the future). """ return Question.objects.filter( pub_date__lte=timezone.now() ).order_by('-pub_date')[:5] ## simple detail #def detail(request, question_id): # return HttpResponse("You're looking at question %s." % question_id) ## meaningful detail #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}) ## meaningful and easy to write detail #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 get_queryset(self): """ Excludes any questions that aren't published yet. """ return Question.objects.filter(pub_date__lte=timezone.now()) #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) 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,)))