Django创建投票应用

目录

创建应用

创建模型mysite\\polls\\models.py

激活模型mysite\\setting.py

为模型的改变生成迁移文件

应用数据库迁移

创建管理员账号

管理投票应用mysite\\polls\\admin.py

添加视图mysite\\polls\\views.py

添加路径mysite\\polls\\urls.py

创建模版mysite\\polls\\templates\\polls\\index.html

[启动开发服务器python manage.py runserver](#启动开发服务器python manage.py runserver)


关于数据库配置,更多内容请看在Django中配置PostgreSQL-CSDN博客

创建应用

bash 复制代码
python manage.py startapp polls

创建模型

mysite\\polls\\models.py

python 复制代码
from django.db import models


class Question(models.Model):

    question_text = models.CharField(max_length=200)

    pub_date = models.DateTimeField("date published")

  
class Choice(models.Model):

    question = models.ForeignKey(Question, on_delete=models.CASCADE)

    choice_text = models.CharField(max_length=200)

    votes = models.IntegerField(default=0)

激活模型

mysite\\setting.py

python 复制代码
INSTALLED_APPS = [

    "polls.apps.PollsConfig",

    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",

]

为模型的改变生成迁移文件

bash 复制代码
python manage.py makemigrations polls

应用数据库迁移

python 复制代码
python manage.py migrate

创建管理员账号

python 复制代码
python manage.py createsuperuser

管理投票应用

mysite\\polls\\admin.py

python 复制代码
from django.contrib import admin
from .models import Question,Choice

# class ChoiceInline(admin.StackedInline):

#     model = Choice

#     extra = 3

# 通过 TabularInline (替代 StackedInline )  单行显示关联

class ChoiceInline(admin.TabularInline):

    model = Choice

    extra = 3

  

class QuestionAdmin(admin.ModelAdmin):

    fieldsets = [

        (None, {"fields": ["question_text"]}),

        ("Date information", {"fields": ["pub_date"], "classes": ["collapse"]}),

    ]

    inlines = [ChoiceInline]

  
  

admin.site.register(Question, QuestionAdmin)

添加视图

mysite\\polls\\views.py

python 复制代码
from django.shortcuts import render, get_object_or_404,HttpResponseRedirect
from django.http import HttpResponse
from django.urls import reverse
from .models import Question,Choice

def index(request):
    latest_question_list = Question.objects.order_by("-pub_date")[:5]
    template = "polls/index.html"
    context = {
        "latest_question_list": latest_question_list,
    }
    return render(request,template,context)

def detail(request,question_id):
    question = get_object_or_404(Question,pk=question_id)
    template = "polls/detail.html"
    context = {
        "question":question,
    }

    return render(request,template,context)

def results(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    template = "polls/results.html"
    context = {
        "question": question,
    }

    return render(request,template,context)

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):
        template = "polls/detail.html"
        context = {
                "question": question,
                "error_message": "You didn't select a choice.",
        }
        return render(request,template,context)
    else:

        selected_choice.votes += 1
        selected_choice.save()

        return HttpResponseRedirect(reverse("polls:results", args=(question.id,)))

添加路径

mysite\\polls\\urls.py

python 复制代码
from django.urls import path
from . import views

app_name = "polls"
urlpatterns = [
    path("", views.index, name="index"),
    path("<int:question_id>/", views.detail, name="detail"),
    path("<int:question_id>/results/", views.results, name="results"),
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

mysite\\urls.py

python 复制代码
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path("polls/",include("polls.urls")),
    path("admin/", admin.site.urls),
]

创建模版

mysite\\polls\\templates\\polls\\index.html

html 复制代码
<!DOCTYPE html>

<html lang="zh">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

  

<body>

    {% if latest_question_list %}

    <ul>

        {% for question in latest_question_list %}

        <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>

        {% endfor %}

    </ul>

    {% else %}

    <p>No polls are available.</p>

    {% endif %}

</body>

</html>

mysite\\polls\\templates\\polls\\detail.html

html 复制代码
<!DOCTYPE html>

<html lang="zh">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>


<body>

    <form action="{% url 'polls:vote' question.id %}" method="post">

        {% csrf_token %}

        <fieldset>

            <legend>

                <h1>{{ question.question_text }}</h1>

            </legend>

            {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

            {% 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 %}

        </fieldset>

        <input type="submit" value="Vote">

    </form>

  

</body>

</html>

mysite\\polls\\templates\\polls\\results.html

html 复制代码
<!DOCTYPE html>

<html lang="zh">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</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 %}">Vote again?</a>

</body>

</html>

启动开发服务器

python manage.py runserver

管理地址

http://127.0.0.1:8000/admin/
应用地址

http://127.0.0.1:8000/polls/

相关推荐
云空11 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺1 小时前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森1 小时前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、2 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
知识的宝藏2 小时前
Django中间件应该怎么使用
中间件·django
千澜空3 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩3 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903133 小时前
【算法】(Python)动态规划
python·算法·动态规划