基于Django1.11和Python3

一、创建一个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.py

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

urlpatterns = [
    url(r'^$', views.index, name="index"),
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name="detail"),
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name="results"),
    url(r'^(?P<question_id>[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:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% if lastest_question_list %}
    <ul>
        {% for question in lastest_question_list %}
            <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>
        {% endfor %}
    </ul>
{% else %}
    <p>No polls are avaiable.</p>
{% endif %}
</body>
</html>

detail.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<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="提交"/>
</form>
</body>
</html>

results.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<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 %}">再次投票</a>
<a href="{% url 'polls:index' %}">返回首页</a>
</body>
</html>

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

http://127.0.0.1:8000/polls/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值