一、创建一个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 adminfrom .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, includefrom django.contrib import adminurlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^polls/', include("polls.urls", namespace="polls")),]
十、编辑polls/urls.py
from django.conf.urls import urlfrom polls import viewsurlpatterns = [ 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, redirectfrom .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:
Title {% if lastest_question_list %}
- {% for question in lastest_question_list %}
- { { question.question_text }} {% endfor %}
No polls are avaiable.
{% endif %}detail.html:
Title { { question.question_text }}
{% if error_message %}{ { error_message }}
{% endif %}
results.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/
十四、githup源码地址: