处理用户投票,问题详情页展示选项,用户选择之后点击投票

    1. # appname/views.py
    2. from django.http import HttpResponseRedirect # 跳转
    3. from django.shortcuts import render, get_object_or_404
    4. from django.urls import reverse # 不用硬编码,可以直接用 命名空间:页面名称 来生成链接
    5. from django.db.models import F # 避免竞争条件
    6. from .models import Question, Choice
    7. def vote(request, question_id):
    8. """
    9. 处理用户投票
    10. """
    11. question = get_object_or_404(Question, id=question_id)
    12. try:
    13. selected_choice = question.choice_set.get(pk=request.POST['choice'])
    14. # 如果 request.POST['choice'] 中没有数据就会引发 KeyError
    15. except (KeyError, Choice.DoesNotExist):
    16. # 重新加载投票表单
    17. return render(request, 'polls/detail.html', {
    18. 'question': question,
    19. 'error_message': '你没有选择任何选项'
    20. })
    21. else:
    22. # 增删数据用 Django 数据库 API
    23. selected_choice.votes = F('votes') + 1 # 使用 F() 避免竞争条件
    24. selected_choice.save()
    25. # 处理好 POST 表单之后总要返回一个 HttpResponseRedirect
    26. # 防止用户后退导致表单提交两次
    27. # HttpResponseRedirect 只接收一个参数:重定向 URL
    28. # reverse('URLconf视图名', args=[URL 中所需参数])
    29. return HttpResponseRedirect(reverse('firstapp:result', args=[question.id]))