项目创建与启动的基本操作
- 创建项目
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函数的参数含义
- route: 匹配URL的准则,当django响应一个请求时,它会遍历urlpatterns数组的每一项,直到找到匹配的值。它不会匹配GET和POST的参数或域名。
- view: 当django找到一个匹配的规则后,就会调用对应影响的views函数,并传入一个HttpRequest对象作为第一个参数,被捕获的参数以关键字的形式传入。
- kwargs: 将参数作为字典传入视图函数
- 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/