基于Django1.11和Python3

发布时间:2019-09-26 07:31:15编辑:auto阅读(1664)

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

    wKiom1nbYXaTcdbFAAB5gZkafWA588.jpg-wh_50

    wKiom1nbYduwsdzcAABxkzNKu34711.jpg-wh_50

    wKioL1nbYYqRFAbQAAC0ZmMUnE0323.jpg-wh_50


    九、编辑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/


    十四、githup源码地址: https://github.com/daibaiyang119/VotingSystem


关键字