当前位置:  首页>> 技术小册>> Django框架入门指南

实战项目二:开发在线投票系统

引言

在前面的章节中,我们已经深入学习了Django框架的基础知识,包括模型的创建、视图的编写、表单的处理以及模板的渲染等核心功能。本章节,我们将通过实战项目——开发一个在线投票系统,来综合运用这些知识点,进一步巩固和提升你的Django开发能力。本项目旨在创建一个简单的在线平台,允许用户创建投票、浏览投票、参与投票,并查看投票结果。

项目规划

在开始编码之前,首先明确项目的需求和功能模块:

  1. 用户系统:用户需要注册和登录才能创建投票或参与投票。
  2. 投票管理:管理员或注册用户可以创建新的投票,设置投票标题、选项,并设定投票的截止时间。
  3. 投票参与:注册用户可以选择一个或多个选项参与投票(具体取决于投票是否为多选)。
  4. 结果展示:投票结束后,展示投票结果,包括每个选项的票数及占比。
  5. 权限控制:确保只有合法用户能进行投票、查看结果等操作。

环境准备

确保你的开发环境中已安装Python和Django。推荐使用虚拟环境来隔离项目依赖。安装Django(如果尚未安装)的命令如下:

  1. pip install django

创建项目与应用

  1. 创建Django项目

    1. django-admin startproject voting_system
    2. cd voting_system
  2. 创建应用

    1. python manage.py startapp polls

    这里,polls 应用将包含投票系统的所有逻辑。

定义模型

polls/models.py 中定义 VoteChoice 模型。Vote 代表一个投票,而 Choice 代表投票中的一个选项。

  1. from django.db import models
  2. from django.contrib.auth.models import User
  3. from django.utils import timezone
  4. class Vote(models.Model):
  5. title = models.CharField(max_length=200)
  6. pub_date = models.DateTimeField('date published', default=timezone.now)
  7. is_active = models.BooleanField(default=True)
  8. creator = models.ForeignKey(User, on_delete=models.CASCADE)
  9. def __str__(self):
  10. return self.title
  11. class Choice(models.Model):
  12. vote = models.ForeignKey(Vote, on_delete=models.CASCADE)
  13. choice_text = models.CharField(max_length=200)
  14. votes = models.IntegerField(default=0)
  15. def __str__(self):
  16. return self.choice_text

注意,这里我们使用了 User 模型来表示投票的创建者,需要从 django.contrib.auth.models 导入。

创建视图与URL配置

接下来,我们需要为投票系统创建视图,并在 polls/urls.pyvoting_system/urls.py 中配置URL。

  1. polls/views.py 中编写视图
    编写视图函数来处理投票的创建、显示、投票和结果展示。

    1. from django.shortcuts import render, get_object_or_404, redirect
    2. from django.http import HttpResponse
    3. from django.contrib.auth.decorators import login_required
    4. from .models import Vote, Choice
    5. from .forms import VoteForm, VoteChoiceForm
    6. # 示例视图函数,具体实现省略以节省篇幅
    7. def vote_list(request):
    8. # 列出所有激活的投票
    9. pass
    10. @login_required
    11. def vote_detail(request, vote_id):
    12. # 显示单个投票详情及参与投票
    13. pass
    14. @login_required
    15. def vote_results(request, vote_id):
    16. # 显示投票结果
    17. pass
    18. @login_required
    19. def create_vote(request):
    20. # 创建新投票
    21. pass
  2. polls/urls.py 中配置URL

    1. from django.urls import path
    2. from . import views
    3. urlpatterns = [
    4. path('', views.vote_list, name='vote_list'),
    5. path('<int:vote_id>/', views.vote_detail, name='vote_detail'),
    6. path('<int:vote_id>/results/', views.vote_results, name='vote_results'),
    7. path('create/', views.create_vote, name='create_vote'),
    8. ]
  3. voting_system/urls.py 中包含 polls 的URL配置

    1. from django.contrib import admin
    2. from django.urls import include, path
    3. urlpatterns = [
    4. path('admin/', admin.site.urls),
    5. path('polls/', include('polls.urls')),
    6. ]

编写表单

polls/forms.py 中创建表单类,用于处理投票的创建和投票选项的选择。

  1. from django import forms
  2. from .models import Vote, Choice
  3. class VoteForm(forms.ModelForm):
  4. class Meta:
  5. model = Vote
  6. fields = ['title', 'is_active']
  7. class VoteChoiceForm(forms.Form):
  8. choice = forms.ModelChoiceField(queryset=Choice.objects.none())
  9. def __init__(self, *args, **kwargs):
  10. vote_id = kwargs.pop('vote_id', None)
  11. super(VoteChoiceForm, self).__init__(*args, **kwargs)
  12. if vote_id:
  13. self.fields['choice'].queryset = Choice.objects.filter(vote_id=vote_id)

注意,VoteChoiceFormchoice 字段需要动态地根据投票ID来设置查询集。

模板渲染

polls/templates/polls/ 目录下创建HTML模板文件,用于渲染投票列表、投票详情、投票结果和创建投票的页面。

权限控制

使用Django的内置权限系统或自定义装饰器来控制访问权限,确保只有合法用户可以创建投票、参与投票和查看结果。

测试与调试

编写单元测试和集成测试来验证投票系统的各个功能模块是否按预期工作。使用Django的测试框架(django.test)来编写测试案例。

部署

完成开发后,将项目部署到服务器上,以便用户可以访问和使用在线投票系统。可以选择将Django项目部署到如Heroku、AWS等云服务平台上,或使用传统的Web服务器如Nginx和Gunicorn。

结语

通过开发这个在线投票系统,我们不仅巩固了Django框架的基础知识,还学会了如何将这些知识应用到实际项目中。从模型设计到视图编写,再到表单处理和模板渲染,每一步都紧密关联,共同构成了这个完整的Web应用。希望这个项目能为你今后的Django开发之路打下坚实的基础。


该分类下的相关小册推荐: