返回
踏踏实实使用Django:开发投票App(下)
见解分享
2023-12-05 18:53:22
投票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开发的魅力。