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/

相关推荐
DeniuHe3 分钟前
sklearn 中所有交叉验证数据集划分方式完整总结
人工智能·python·sklearn
DeniuHe6 分钟前
sklearn中不同交叉验证方法的场景适配
人工智能·python·sklearn
隐于花海,等待花开1 小时前
16.Python 常用第三方库概览 深度解析
python
我材不敲代码1 小时前
Python 函数核心:位置参数与关键字参数详解
java·前端·python
风落无尘1 小时前
第十一章《对齐与安全》 完整学习资料
python·安全·机器学习
Kratzdisteln1 小时前
【无标题】
前端·python
hakesashou1 小时前
python文件操作需要导入模块吗
python
wuxinyan1231 小时前
工业级大模型学习之路029:解决双智能体调用数据库报错问题
数据库·人工智能·python·学习·智能体
SunnyDays10111 小时前
Python操作Excel批注:从基础添加到高级自定义的完整指南
开发语言·python·excel
独隅1 小时前
PyTorch自动微分模块:从原理到实战一
人工智能·pytorch·python