Django 开发投票系统

Posted 安迪_963

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 开发投票系统相关的知识,希望对你有一定的参考价值。

主要参考官方文档

Windows  10

Python 23.5

Django 1.9

 

1.创建项目(mysite)与应用(polls

D:\\python>django-admin.py startproject mysite

D:\\python>cd mysite

D:\\python\\mysite>python manage.py startapp polls

创建app后将app加入到setting中,打开mysite/setting.py,将polls这个应用添加进去

INSTALLED_APPS = [
    \'polls.apps.PollsConfig\',
    
    \'django.contrib.admin\',
    \'django.contrib.auth\',
    \'django.contrib.contenttypes\',
    \'django.contrib.sessions\',
    \'django.contrib.messages\',
    \'django.contrib.staticfiles\',
]

2.创建模型

打开polls/models.py

import datetime
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.utils import timezone

# Create your models here.
# 问题
@python_2_unicode_compatible
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField(\'date published\')
    
    def was_published_recently(self):
        now = timezone.now()
        return timezone.now()-datetime.timedelta(days=1) <= self.pub_date <= now

    was_published_recently.admin_order_field = \'pub_date\'
    was_published_recently.boolean = True
    was_published_recently.short_description = \'Published recently?\'
    
    def __str__(self):
        return self.question_text

# 选择
@python_2_unicode_compatible  
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete = models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    
    def __str__(self):
        return self.choice_text

运行命令:python manage.py makemigrations 和python manage.py migrate全数据库生成相应的表

3.后台管理

打开polls/admin.py,

from django.contrib import admin
from .models import Question, Choice

# Register your models here.

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class QuestionAdmin(admin.ModelAdmin):
    fieldsets = [
        (None, {\'fields\': [\'question_text\']}),
        (\'Date information\', {\'fields\': [\'pub_date\']}),
    ]
    inlines = [ChoiceInline]

    list_filter = [\'pub_date\']
    list_display = (\'question_text\', \'pub_date\', \'was_published_recently\')
    search_fields = [\'question_text\']

admin.site.register(Question, QuestionAdmin)

4.编写视图函数(展示)

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, Http404
from .models import Question, Choice
from django.core.urlresolvers import reverse
from django.views import generic
from django.utils import timezone

# Create your views here.

# 展示所有问题
class IndexView(generic.ListView):
    template_name = \'polls/index.html\'
    context_object_name = \'latest_question_list\'


    def get_queryset(self):
        #return the last five published question
        return Question.objects.filter(pub_date__lte = timezone.now()).order_by(\'-pub_date\')[:5]

# 查看问题详情
class DetailView(generic.DetailView):
    model = Question
    template_name = \'polls/detail.html\'

    def get_queryset(self):
        """
        Excludes any questions that aren\'t published yet.
        """
        return Question.objects.filter(pub_date__lte=timezone.now())
# 查看结果
class ResultsView(generic.DeleteView):
    model = Question
    template_name = \'polls/detail.html\'

# 投票
def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=request.POST[\'choice\'])
    except (KeyError, Choice.DoesNotExist):
    # Redisplay the question voting form.
        return render(request, \'polls/detail.html\', {\'question\': question, \'error_message\': "You didn\'t select a choice.",})
    else:
        selected_choice.votes += 1
        selected_choice.save()
        # Always return an HttpResponseRedirect after successfully dealing
        # with POST data. This prevents data from being posted twice if a
        # user hits the Back button.
    return HttpResponseRedirect(reverse(\'polls:results\', args=(question.id,)))

5.模板

视图函数处理的结果通过模板展示出来

detail.html

<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
<form action="{% url \'polls:vote\' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
<input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
</form>

index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

results.html

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
<li>{{ choice.choice_text }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
{% endfor %}
</ul>
<a href="{% url \'polls:detail\' question.id %}">Vote again?</a>

6.url分发

不同的url在这里进行分发到不同的函数处理

mysite/urls.py

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r\'^polls/\', include(\'polls.urls\')),
    url(r\'^admin/\', admin.site.urls),
]

再次分发

polls/urls.py

#coding:utf-8
#!/usr/bin/env python

from django.conf.urls import url
from . import views

app_name = \'polls\'
urlpatterns = [
               # ex: /polls/
               url(r\'^$\', views.IndexView.as_view(), name=\'index\'),
               # ex: /polls/5/
               url(r\'^(?P<pk>[0-9]+)/$\', views.DetailView.as_view(), name=\'detail\'),
               # /polls/5/results/
               url(r\'^(?P<pk>[0-9]+)/results/$\', views.ResultsView.as_view(), name=\'results\'),
               # /polls/5/vote/
               url(r\'^(?P<question_id>[0-9]+)/vote/$\', views.vote, name=\'vote\'),
               ]

输入命令python manage.py runserver,运行系统

登陆后:

不登陆,可以查看到相应的问题,选中相应的小圆点,点击vote可进行投票。

 

以上是关于Django 开发投票系统的主要内容,如果未能解决你的问题,请参考以下文章

Django 开发投票系统

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

接口测试随笔四之根据Django web框架进行接口测试

使用 django 进行 reddit 风格投票

在不使用帐户的情况下设计 Django 投票系统

Django Web开发 投票与评论