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/

相关推荐
网络风云3 分钟前
Flask 的 Docker 部署指南
python·docker·flask
飞天小蜈蚣7 分钟前
django的模板渲染、for循环标签、继承模板
数据库·python·django
飞Link7 分钟前
【Anaconda】Linux(CentOS7)下安装Anaconda教程
linux·运维·python
web3.088899916 分钟前
小红书笔记评论API接口详情展示
开发语言·笔记·python
手抄二进制17 分钟前
使用Anaconda创建python环境并链接到Jupyter
开发语言·python·jupyter
知凡D30 分钟前
python脚本打包成exe后,对其引用的日历库实时更新-动态化加载模块
python·测试工具
kobe_OKOK_1 小时前
快递鸟对接发快递后端设计系统
python·django
阿蔹1 小时前
UI测试自动化-Web-Python-Selenium-2-元素操作、浏览器操作
前端·python·selenium·ui·自动化
Tipriest_1 小时前
配置用户pip源与查看当前的pip的源的办法
linux·人工智能·python·pip
雪域迷影2 小时前
使用Python库获取网页时报HTTP 403错误(禁止访问)的解决办法
开发语言·python·http·beautifulsoup·urllib