django 投票小项目

本文介绍如何使用Django创建一个投票应用,包括项目的搭建、应用的创建、视图的定义及URL配置等内容,并展示了两种实现视图的方法。

创建一个mysite项目

django-admin startproject mysite

创建一个polls应用

django-admin startapp polls

mkdir polls/templates/ 创建模板文件夹

polls.views.py 内容如下

from django.shortcuts import get_object_or_404, render
from django.core.urlresolvers import reverse
from django.views import generic
# 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 questions."""
        return Question.objects.order_by('-pub_date')[:5]

class DetailView(generic.DetailView):
    model = Question
    template_name = 'polls/detail.html'

class ResultsView(generic.DetailView):
    model = Question
    template_name = 'polls/results.html'
def vote(request, question_id):
    p = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
            # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {'question': p,'error_message': "You didn't select a choice.",})
    else:
        selected_choice.votes += 1
        selected_choice.save()
    return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))

以上采用的是generic View的方法,还可以用下面的方法

from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect
from polls.models import Question,Choice
from django.template import RequestContext ,loader
from django.shortcuts import get_object_or_404, render
from django.core.urlresolvers import reverse
# Create your views here.

def detail(request, question_id):
    text = Question.objects.filter(pk=question_id)
    #return HttpResponse("You're looking at question %s." % question_id)
    #return HttpResponse(text)
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

def results(request, question_id):

    #response = "You're looking at the results of question %s."
    #return HttpResponse(response % question_id)
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/results.html', {'question': question})

def vote(request, question_id):
    #return HttpResponse("You're voting on question %s." % question_id)
    p = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = p.choice_set.get(pk=request.POST['choice'])
    except (KeyError, Choice.DoesNotExist):
        # Redisplay the question voting form.
        return render(request, 'polls/detail.html', {'question': p,'error_message': "You didn't select a choice.",})
    else:
        selected_choice.votes += 1
        selected_choice.save()
    return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list':latest_question_list}
    return render(request,'polls/index.html',context)
                                                                                                   40,1-4       底端

app02/models.py

from django.db import models
from django.utils import timezone
import datetime
from django.contrib.contenttypes.fields import GenericForeignKey
# Create your models here.
class  Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1) #判断是否是最近发布的
    was_published_recently.admin_order_field = 'pub_date'  #用pub_date字段排序
    was_published_recently.boolean = True   #如果是最近发布的就会显示一个标志出来
    was_published_recently.short_description = 'Published recently?'  #描述

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

app02/urls.py

from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
        url(r'^$', views.IndexView.as_view(), name='index'),
        url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
        url(r'^(?P<pk>\d+)/results/$', views.ResultsView.as_view(), name='results'),
        url(r'^(?P<question_id>\d+)/vote/$', views.vote, name='vote'),

        )

还有另一种方法

from django.conf.urls import patterns, url
from polls import views
urlpatterns = patterns('',
        # ex: /polls/
        #url(r'^$', views.index, name='index'),
        # ex: /polls/5/
        url(r'^(?P<question_id>\d+)/$', views.detail, name='detail'),
        # ex: /polls/5/results/
        url(r'^(?P<question_id>\d+)/results/$', views.results, name='results'),
        # ex: /polls/5/vote/
        url(r'^(?P<question_id>\d+)/vote/$', views.vote, name='vote'),
        (r'^pl/$', 'polls.views.index'),
        )
                                                                                                                                                                                                  

 

转载于:https://www.cnblogs.com/zhuweiblog/p/5184236.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值