返回

踏踏实实使用Django:开发投票App(下)

见解分享

投票App:这并不是一项传统的任务,但它是一个非常好的例子,因为它涉及到我们很熟悉的领域,如获取用户数据、存入数据库、处理请求和渲染结果等。在这个例子中,投票App将作为我们用来探索Django的工作horse。

从模型开始

应用程序涉及到的信息以模型的形式存储在数据库中。我们的投票App涉及两个模型:问题选择

问题模型是我们感兴趣的信息的表示,我们将定义一些属性来问题。选择模型是问题模型的子模型,其中包含了问题的选项以及每个选项的票数。

定义问题和选择模型的代码如下:

from django.db import models

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

创建投票表单

现在我们定义了模型,我们需要创建表单来处理用户的请求。在Django中,我们使用Form类来处理用户的请求,如接收用户的输入、验证数据、生成HTML代码等。

我们定义一个名为PollForm的表单类,它与Poll模型关联,其中包含问题和发布日期字段。

from django import forms

class PollForm(forms.ModelForm):
    class Meta:
        model = Poll
        fields = ['question', 'pub_date']

处理投票请求

当用户提交投票表单时,我们需要处理这个请求,并根据用户的选择更新数据库。我们在views.py文件中定义一个名为vote()的函数来处理投票请求。

def vote(request, poll_id):
    poll = get_object_or_404(Poll, pk=poll_id)
    try:
        selected_choice = poll.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # 重新渲染表单
        return render(request, 'polls/detail.html', {
            'poll': poll,
            'error_message': "You didn't select a choice.",
        })
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # 重新定向到结果页面
        return HttpResponseRedirect(reverse('polls:results', args=(poll.id,)))

显示投票结果

当用户投票后,我们需要显示投票结果。我们在views.py文件中定义一个名为results()的函数来处理这个请求。

def results(request, poll_id):
    poll = get_object_or_404(Poll, pk=poll_id)
    return render(request, 'polls/results.html', {'poll': poll})

在模板results.html中,我们可以使用以下代码来显示投票结果:

<h1>{{ poll.question }}</h1>

<ul>
{% for choice in poll.choice_set.all %}
<li>{{ choice.choice_text }} - {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>

总结

在本节中,我们完成了Django基本投票App的开发。我们创建了问题和选择模型,定义了表单来处理用户的请求,编写了函数来处理投票请求,并显示了投票结果。

通过这个例子,我们对Django有了更深入的了解,掌握了创建和管理Web应用程序的基本技能。在接下来的文章中,我们将继续探索Django的更多功能,带您领略Python Web开发的魅力。