django学习之编写简单应用投票系统(1)

项目创建与启动的基本操作

  • 创建项目
django-admin startproject mysite

创建后会生成相关的django的文件,其目录结构如下

mysite/             --项目的容器
    manage.py       --管理django项目的命令行工具
    mysite/         --实际的项目目录,开发的代码都放到这里面
        __init__.py -- 空文件,表示该目录可以作为包来import  
        settings.py -- 项目的配置文件
        urls.py     --URL配置文件
        asgi.py     -- 项目运行在ASGI兼容的web服务器上的入口
        wsgi.py     --项目运行在WSGI兼容的web服务器上的入口
  • 启动web服务器
python.exe manage.py runserver

![[Pasted image 20231118190729.png]]

现在表示成功启动成功一个空的web服务器,默认的IP地址和端口是127.0.0.1:8000,这个可以在启动时指定,如

python manage.py runserver 192.168.10.11:9001

创建一个投票应用

创建简单应用

  • 创建一个应用
python manage.py startapp polls
  • 编写视图
    修改polls/views.py文件
from django.http import HttpResponse  
from django.test import TestCase  
  
  
# Create your tests here.  
def index(request):  
    return HttpResponse("Hello, world. You're at the polls index.")
  • 配置URL映射
    在polls目录下新建一个文件urls.py,增加对应配置信息
from django.urls import path  
  
from polls import views  
  
urlpatterns = [  
    path('', views.index, name='index'),  
]
  • 配置根URL配置,在mysite目录下的urls.py
from django.contrib import admin  
from django.urls import path, include  
  
urlpatterns = [  
    path('admin/', admin.site.urls),  
    path('polls/', include('polls.urls')),  
]

当应用目录下包含有urls.py时,这里应该使用include。include允许引用其他的URL配置,每当django遇到include时,都会截断与此匹配的URL的部分,并将剩余的部分发送到URL配置以供进一步处理。
path函数的参数含义

  1. route: 匹配URL的准则,当django响应一个请求时,它会遍历urlpatterns数组的每一项,直到找到匹配的值。它不会匹配GET和POST的参数或域名。
  2. view: 当django找到一个匹配的规则后,就会调用对应影响的views函数,并传入一个HttpRequest对象作为第一个参数,被捕获的参数以关键字的形式传入。
  3. kwargs: 将参数作为字典传入视图函数
  4. name: 为URL命名,这样就可以在其他地方引用它。
  • 再次运行查看更新之后的效果
python manage.py runserver

![[Pasted image 20231118194421.png]]
注意: 这里的url是http://127.0.0.1:8000/polls/

数据库配置

Django默认使用sqllite作为默认数据库,SQLlite在安装Django时已经默认安装,settings.py里的配置也是配置的SQLlite数据库。由于本人对pg比较熟悉,且搭建有一套pg数据库,这里配置为pg数据库

  • 在settings.py中添加数据库的配置
DATABASES = {  
    'default': {  
        'ENGINE': 'django.db.backends.postgresql',  
        'NAME': 'djangodb',  
        'USER': 'djuser',  
        'PASSWORD': 'passwd',  
        'HOST': '192.168.134.128',  
        'PORT': '5432',  
    }  
}
  • 安装psycopg2工具
pip install psycopg2
  • 生成数据库表文件
python manage.py migrate

执行之后会在数据库中生成下面的表:

 djangodb=# \d
                       List of relations
 Schema |               Name                |   Type   | Owner  
--------+-----------------------------------+----------+--------
 public | auth_group                        | table    | djuser
 public | auth_group_id_seq                 | sequence | djuser
 public | auth_group_permissions            | table    | djuser
 public | auth_group_permissions_id_seq     | sequence | djuser
 public | auth_permission                   | table    | djuser
 public | auth_permission_id_seq            | sequence | djuser
 public | auth_user                         | table    | djuser
 public | auth_user_groups                  | table    | djuser
 public | auth_user_groups_id_seq           | sequence | djuser
 public | auth_user_id_seq                  | sequence | djuser
 public | auth_user_user_permissions        | table    | djuser
 public | auth_user_user_permissions_id_seq | sequence | djuser
 public | django_admin_log                  | table    | djuser
 public | django_admin_log_id_seq           | sequence | djuser
 public | django_content_type               | table    | djuser
 public | django_content_type_id_seq        | sequence | djuser
 public | django_migrations                 | table    | djuser
 public | django_migrations_id_seq          | sequence | djuser
 public | django_session                    | table    | djuser
创建模型

在Django中写一个数据库驱动的web应用的第一步是定义模型,也就是设计表结构。
在投票应用中,需要创建两个模型。

  • Question: 包括问题描述和发布时间
  • Choice: 包括选项描述和当前得票数。
  • 它的实现是在modules.py中
from django.db import models  
  
# Create your models here.  
class Question(models.Model):  
    question_text = models.CharField(max_length=200)  
    pub_date = models.DateTimeField("date published")  
  
  
class Choice(models.Model):  
    qustion = models.ForeignKey(Question)  
    choice_text = models.CharField(max_length=200)  
    votes = models.IntegerField(default=0)

每个模型被表示为django.db.modules.Module类的子类,每个模型都有许多变量,他们都表示模型里的一个数据库字段。每个字段的都是Field类的实例,比如字符类型被表示为CharField,日期类型被表示为dateTimeFiled。

激活模型
  • 将应用包含到项目中,修改settings.py
INSTALLED_APPS = [  
    'django.contrib.admin',  
    'django.contrib.auth',  
    'django.contrib.contenttypes',  
    'django.contrib.sessions',  
    'django.contrib.messages',  
    'django.contrib.staticfiles',  
    'polls.apps.PollsConfig',  
]
  • 存储模型文件迁移,迁移到migrations目录下migrations/0001_initial.py中
python manage.py makemigrations polls
  • 数据库迁移并同步表结构
python manage.py sqlmigrate polls 0001

执行后会得到对应的SQL语句

BEGIN;
--
-- Create model Question
--
CREATE TABLE "polls_question" (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "question_text" varchar(200) NOT NULL,
    "pub_date" timestamp with time zone NOT NULL
);
--
-- Create model Choice
--
CREATE TABLE "polls_choice" (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "choice_text" varchar(200) NOT NULL,
    "votes" integer NOT NULL,
    "question_id" bigint NOT NULL
);
ALTER TABLE "polls_choice"
  ADD CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id"
    FOREIGN KEY ("question_id")
    REFERENCES "polls_question" ("id")
    DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "polls_choice_question_id_c5b4b260" ON "polls_choice" ("question_id");

COMMIT;

输出的内容与数据库有关,这里我选用的是pg,所以输出的是pg的SQL

  • 检查项目中是否有问题
python manage.py check
  • 在数据库中创建新定义的的模型的表
python manage.py migrate

迁移是非常强大的功能,它能让我们在开发过程中持续的改变数据库表结构而不需要重建表。它专注于是数据库平滑升级而不会丢失数据。

创建管理员账号

  • 创建管理员用户
python.exe .\manage.py createsuperuser
  • 输入用户名
Username (leave blank to use 'zfsnc'): admin
  • 输入邮件地址
Email address: xxx@163.com
  • 输入密码
Password: ******
Password (again):*****
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
  • 启动服务器
python manage.py runserver
  • 登录页面
    在这里插入图片描述

在这里插入图片描述

向管理页面中添加投票应用、

投票应用没在索引页面中显示,现在需要告诉管理,问题Question对象需要一个后台接口,打开polls.admin.py,进行编辑

from django.contrib import admin  
  
from polls.models import Question  
  
# Register your models here.  
admin.site.register(Question)

这样就会向管理页面注册Question类
在这里插入图片描述

  • 点开Question,可以看到Question对象的列表,这里会显示数据库里的所有的Question对象
    下面讲下怎么添加Question对象

使用API添加Question对象

  • 启动Python的命令行
python manage.py shell
  • 在shell交互界面执行下面命令
>>> from polls.models import Choice, Question
>>> Question.objects.all()  
<QuerySet [<Question: What's aaa>]>
>>> from django.utils import timezone
>>> q = Question(question_text="Who are  you?", pub_date=timezone.now()) 
>>> q.save()
>>> q.id
2
>>> q.question_text
'Who are  you?'
>>> q.pub_date
datetime.datetime(2023, 11, 19, 14, 36, 24, 147919, tzinfo=datetime.timezone.utc)
  • 上述执行完之后,再次启动server
python manage.py runserver
  • 打开浏览器,可以看到我们新添加的Question对象“Who are you?"已经添加进去了
    在这里插入图片描述

在这里插入图片描述

注意: 这个表单是Question模型中自动生成的,不同的字段类型会生成对应的HTML输入控件,每个类型的字段都知道他们该如何在管理页面里显示自己。

常见问题

【参考】 Django4.18官方文档: https://docs.djangoproject.com/zh-hans/4.1/ref/databases/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值