在前面的章节中,我们已经深入学习了Django框架的基础知识,包括模型的创建、视图的编写、表单的处理以及模板的渲染等核心功能。本章节,我们将通过实战项目——开发一个在线投票系统,来综合运用这些知识点,进一步巩固和提升你的Django开发能力。本项目旨在创建一个简单的在线平台,允许用户创建投票、浏览投票、参与投票,并查看投票结果。
在开始编码之前,首先明确项目的需求和功能模块:
确保你的开发环境中已安装Python和Django。推荐使用虚拟环境来隔离项目依赖。安装Django(如果尚未安装)的命令如下:
pip install django
创建Django项目:
django-admin startproject voting_system
cd voting_system
创建应用:
python manage.py startapp polls
这里,polls
应用将包含投票系统的所有逻辑。
在 polls/models.py
中定义 Vote
和 Choice
模型。Vote
代表一个投票,而 Choice
代表投票中的一个选项。
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
class Vote(models.Model):
title = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published', default=timezone.now)
is_active = models.BooleanField(default=True)
creator = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
class Choice(models.Model):
vote = models.ForeignKey(Vote, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
def __str__(self):
return self.choice_text
注意,这里我们使用了 User
模型来表示投票的创建者,需要从 django.contrib.auth.models
导入。
接下来,我们需要为投票系统创建视图,并在 polls/urls.py
和 voting_system/urls.py
中配置URL。
在 polls/views.py
中编写视图:
编写视图函数来处理投票的创建、显示、投票和结果展示。
from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from .models import Vote, Choice
from .forms import VoteForm, VoteChoiceForm
# 示例视图函数,具体实现省略以节省篇幅
def vote_list(request):
# 列出所有激活的投票
pass
@login_required
def vote_detail(request, vote_id):
# 显示单个投票详情及参与投票
pass
@login_required
def vote_results(request, vote_id):
# 显示投票结果
pass
@login_required
def create_vote(request):
# 创建新投票
pass
在 polls/urls.py
中配置URL:
from django.urls import path
from . import views
urlpatterns = [
path('', views.vote_list, name='vote_list'),
path('<int:vote_id>/', views.vote_detail, name='vote_detail'),
path('<int:vote_id>/results/', views.vote_results, name='vote_results'),
path('create/', views.create_vote, name='create_vote'),
]
在 voting_system/urls.py
中包含 polls
的URL配置:
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls')),
]
在 polls/forms.py
中创建表单类,用于处理投票的创建和投票选项的选择。
from django import forms
from .models import Vote, Choice
class VoteForm(forms.ModelForm):
class Meta:
model = Vote
fields = ['title', 'is_active']
class VoteChoiceForm(forms.Form):
choice = forms.ModelChoiceField(queryset=Choice.objects.none())
def __init__(self, *args, **kwargs):
vote_id = kwargs.pop('vote_id', None)
super(VoteChoiceForm, self).__init__(*args, **kwargs)
if vote_id:
self.fields['choice'].queryset = Choice.objects.filter(vote_id=vote_id)
注意,VoteChoiceForm
的 choice
字段需要动态地根据投票ID来设置查询集。
在 polls/templates/polls/
目录下创建HTML模板文件,用于渲染投票列表、投票详情、投票结果和创建投票的页面。
使用Django的内置权限系统或自定义装饰器来控制访问权限,确保只有合法用户可以创建投票、参与投票和查看结果。
编写单元测试和集成测试来验证投票系统的各个功能模块是否按预期工作。使用Django的测试框架(django.test
)来编写测试案例。
完成开发后,将项目部署到服务器上,以便用户可以访问和使用在线投票系统。可以选择将Django项目部署到如Heroku、AWS等云服务平台上,或使用传统的Web服务器如Nginx和Gunicorn。
通过开发这个在线投票系统,我们不仅巩固了Django框架的基础知识,还学会了如何将这些知识应用到实际项目中。从模型设计到视图编写,再到表单处理和模板渲染,每一步都紧密关联,共同构成了这个完整的Web应用。希望这个项目能为你今后的Django开发之路打下坚实的基础。