python投票管理系统_基于Django1.11和Python3开发一个简单的投票系统

本文介绍了如何使用Python3和Django1.11开发一个简单的投票系统。从创建VotingSystem项目和polls应用开始,接着配置templates路径、编辑model.py创建数据库模型,然后同步数据库、生成admin账户,再注册model到admin并启动服务器。此外,还详细讲解了URL路由、视图函数和模板文件的编写,最终完成一个可以展示、投票和查看结果的投票系统。
摘要由CSDN通过智能技术生成

一、创建一个VotingSystem项目以及polls应用$ django-admin.py startproject VotingSystem

$ cd VotingSystem

$ python3 manage.py startapp polls

注:如果使用Pycharm来创建的话,以上两步都可以省略

二、配置tempaltes路径(如果没有)

a. 先在VotingSystem项目目录下新建一个templates文件夹,注意文件夹权限和属组$ sudo mkdir templates

b. 然后再setting.py文件中添加路径TEMPLATES = [

{

...

'DIRS': [os.path.join(BASE_DIR, 'templates')]

...

},

]

三、将应用名称添加到setting.py文件INSTALLED_APPS选项末尾(如果没有)INSTALLED_APPS = [

...

'polls',

]

注:以上两步如果用Pycharm都可以一步到位

四、编辑polls/model.py,创建数据库模型from django.db import models

# 问题

class Question(models.Model):

question_text = models.CharField(max_length=200)

# 双引号中定义的是在admin页面显示的verbose_name

pub_date = models.DateTimeField("date published")

def __str__(self):

return self.question_text

# 问题选项

class Choice(models.Model):

question = models.ForeignKey("Question")

choice_text = models.CharField(max_length=200)

votes = models.IntegerField(default=0)

def __str__(self):

return self.choice_text

五、同步数据库,生成数据库表(这里使用的是默认的sqlite3)$ python3 manage.py makemigrations

$ python3 manage.py migrate

六、生成admin管理账户$ python3 manage.py createsuperuser

七、将model注册到admin中from django.contrib import admin

from .models import *

class ChoiceInline(admin.TabularInline):

model = Choice

extra = 3  # 在admin页面显示额外三个空白表单

class QuestionAdmin(admin.ModelAdmin):

fieldsets = [

(None, {'fields': ['question_text']}),

('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),

]

inlines = [ChoiceInline,]  # 在admin页面显示内联

list_display = ('question_text', 'pub_date')

admin.site.register(Question, QuestionAdmin)

admin.site.register(Choice)

八、启动server,进入admin页面,创建一些问题和选项$ python3 manage.py runserver

九、编辑VotingSystem/urls.py,使用路由分发和命名空间from django.conf.urls import url, include

from django.contrib import admin

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^polls/', include("polls.urls", namespace="polls")),

]

十、编辑polls/urls.pyfrom django.conf.urls import url

from polls import views

urlpatterns = [

url(r'^$', views.index, name="index"),

url(r'^(?P[0-9]+)/$', views.detail, name="detail"),

url(r'^(?P[0-9]+)/results/$', views.results, name="results"),

url(r'^(?P[0-9]+)/vote/$', views.vote, name="vote"),

]

十一、编辑polls/views.py视图文件from django.shortcuts import render, get_object_or_404, HttpResponseRedirect, reverse, redirect

from .models import *

# 首页,展示所有问题

def index(req):

lastest_question_list = Question.objects.all()

return render(req, "polls/index.html", locals())

# 展示单个问题的所有选项

def detail(req, question_id):

question = get_object_or_404(Question, pk=question_id)

return render(req, "polls/detail.html", locals())

# 查看投票结果,

def results(req, question_id):

question = get_object_or_404(Question, pk=question_id)

return render(req, "polls/results.html", locals())

# 选择投票,设置cookie验证

def vote(req, question_id):

p = get_object_or_404(Question, pk=question_id)

if req.COOKIES.get("is_vote", None):

return render(req, "polls/detail.html", {"question": p, "error_message": "你已经投过票了!"})

try:

selected_choice = p.choice_set.get(pk=req.POST['choice'])

except (KeyError, Choice.DoesNotExist):

return render(req, "polls/detail.html", {"question": p, "error_message": "You did't select a choice"})

else:

selected_choice.votes += 1

selected_choice.save()

rep = redirect(reverse("polls:results", args=(p.id,)))

rep.set_cookie("is_vote", True)

return rep

十二、在templates目录下创建polls目录,在polls目录下创建index.html detail.html results.html三个HTML文件

index.html:html>

Title

{% if lastest_question_list %}

{% for question in lastest_question_list %}

{{ question.question_text }}

{% endfor %}

{% else %}

No polls are avaiable.

{% endif %}

detail.html:html>

Title

{{ question.question_text }}

{% if error_message %}

{{ error_message }}

{% endif %}

{% csrf_token %}

{% for choice in question.choice_set.all %}

{{ choice.choice_text }}

{% endfor %}

results.html:html>

Title

{{ question.question_text }}

{% for choice in question.choice_set.all %}

{{ choice.choice_text }} --> {{ choice.votes }} vote{{ choice.votes|pluralize }}

{% endfor %}

再次投票

返回首页

十三、至此我们所有配置都已经配置完毕了,马上运行server,进行访问吧

http://127.0.0.1:8000/polls/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值