1. 配置 settings
静态文件相关:
STATIC_URL = '/static/'
静态文件的别名,可以修改,默认是 /static/ 使用的时候直接写 /static/就可以,不要写文件夹的名字。
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
静态文件存放的目录,这个是自己配置的,可以提供多个地址,使用的时候全都可以用别名访问到。
TEMPLATES 相关:
'DIRS': [
os.path.join(BASE_DIR, "templates")
],
需要加一个 DIRS 配置一下全局模板路径。
新的 App 的注册
INSTALLED_APPS = [
"App.apps.AppConfig",
'App',
]
第一种方法是配置到 App 的 AppConfig 类上,这是推荐写法,这种方法可以让 Django 帮我们做一些额外的操作,第二种就是直接写上 App 的名字。
中间件相关
MIDDLEWARE = [
# 'django.middleware.csrf.CsrfViewMiddleware',
]
暂时注册掉 csrf 相关的中间件,可以让我们方便地提交 POST 请求。
2. url.py 路径和函数的对应关系
from App import views
urlpatterns = [
path("login/", views.login)
]
列表里写 views 的函数,但是不要写括号(写函数名),注意要导入相应 App 的 views。
3. view.py 写处理函数
from django.http import HttpResponse
from django.shortcuts import render, redirect
def hello(request):
return HttpResponse("返回的字符串")
return render(request, "模板名.html")
return redirect("路由")
目前了解了三种返回的情况,第一种是返回一个字符穿,也可以是 html 标签;第二种是返回模板文件,第一个参数是 request 对象;第三种是返回重定向,需要写完整 url 地址,或者自己写的路由。
在写业务逻辑的时候有一些东西会用得上:
request.method
if request.method == "POST":
pass
获取请求方式,字符串
request.POST 和 request.GET
# 处理 POST 请求
# 获取用户名和密码
user = request.POST.get('inputEmail')
pwd = request.POST.get('inputPassword')
获取 POST请求数据提交的数据是,一个字典。可以通过正常的字典方法获取数据,但是在找不到 key 的时候会包错所以专门包装了一个 request.POST.get() 来获取值。
request.GET 来获取 url 上的查询参数,也是一个字典。
ps POST 和 GET 的区别
- GET 获取一个资源,在地址栏中输入地址回车就可以发 Get 请求
- POST 提交数据不会显示在 url 中,发 POST 请求 可以使用 form 表单。
form 表单需要注意的点
- form 标签的属性 action :指定提交的地址(不写默认是当前地址);method :请求方式(默认get)
- input 标签要有 name 属性,有的标签还需要有 value
- 有一个 button 按钮或者是 typy = “submit” 的 input
- 可以在 form 表单加一个 novalidate 取消前端校验
4. ORM
ORM 对象关系映射,通过操作面向对象的方式操作数据库。
优点是可以更好的让开发人员关注逻辑,提高开发的效率,但是会降低运行的效率,另外有一些复杂的 SQL 语句没有实现,还是需要自己实现。
对应关系:
面向对象 | 数据库 |
---|---|
类 | 表 |
对象 | 数据行(记录) |
属性 | 字段 |
给数据库修改表结构:
- 在 app 下的 models 中写类并继承 Model
from django.db import models
class User(models.Model):
userName = models.CharField(max_length=32)
password = models.CharField(max_length=32)
- 执行数据库迁移命令
python manage.py makemigrations
python manage.py migrate
首先创建迁移文件(检测并记录 models 文件有什么变化),然后迁移,将变更迁移到数据库中。
执行 makemigrations 会创建一个 migrations 文件,如果执行 makemigrations 之后想要重新修改,只需删除最新的 migrations 文件,然后修改 models 文件,重新执行 makemigrations 命令。
简单的 orm 语法
def orm(request):
## orm 的测试
from App import models
ret = models.User.objects.all() # 获取表中所有数据 QuerySet 对象列表
for i in ret:
print(i, i.userName, i.password, type(i.userName))
# 获取数据列表中的数据
ret = models.User.objects.get(userName = "123", password = "123")
# 获取一条数据,获取不到或者获取到多条数据的时候就会包错
ret = models.User.objects.filter(userName="123", password="123")
# 获取满足条件的多条数据
if models.User.objects.filter(userName="123", password="123"):
return redirect('/index/')
return render(request, "hello.html")
查询:
models.Publisher.objects.all().order_by('-id')
查询所有数据,根据 id 倒序排序,获取的是数据列表
models.Publisher.objects.get(name='???', pk=1)
查询一个数据,name是 ???,主键是 1。获取的是一个对象。注意没有查询到或者不是唯一会报错。
models.Publisher.objects.filter(name='???')
查询多个数据,QuerySet 对象列表。
下面是一个实例
def publisher_list(request):
# 返回一个页面并且展示所有出版社信息
# 获取所有的出版社信息
all_publishers = models.Publisher.objects.all().order_by('-id') # 获取的是数据列表
# for i in all_publishers:
# print(i)
# print(i.name)
# print(i.id)
# 返回页面
return render(request, "publisher_list.html", {'all_publishers':all_publishers})
新增
models.Publisher.objects.create(name='???')
在数据库中新增一个 Publisher 对象,名字是 ???,并返回该对象。
def publisher_add(request):
# post 请求
# 获取用户提交的数据
# 将数据新增到数据库中
# 返回一个重定向到展示出版社的页面
if request.method == "POST":
pub_name = request.POST.get('pub_name')
# print(pub_name)
# 判断是否是重复值
if models.Publisher.objects.filter(name=pub_name):
return render(request, "publisher_add.html", {"error":"出版社名称已经存在"})
# 判断是否是空值
if not pub_name:
return render(request, "publisher_add.html", {"error":"输入不能为空!"})
ret = models.Publisher.objects.create(name=pub_name)
# print(ret, type(ret))
return redirect("/publisher_list/")
return render(request, "publisher_add.html")
删除
models.Publisher.objects.get(pk=???).delete()
models.Publisher.objects.filter(pk=???).delete()
通过单个对象删除和多个对象批量删除。
def publisher_del(request):
# 获取要删除数据的 id
# 根据 id 到数据库进行删除
# 返回重定向到展示新页面
pk = request.GET.get("pk")
models.Publisher.objects.get(pk=pk).delete() # 查询到一个对象列表,删除该对象
return redirect("/publisher_list/")
修改
pub_name = request.POST.get('pub_name')
pub_obj.name = pub_name # 只是在内存中修改了
pub_obj.save() # 在数据库中修改
首先在内存中修改,然后再数据库中修改。
下面是一个实例,注意在修改的时候要判断一下是 post 请求还是一个 get 请求。
def publisher_change(request):
# get
# 获取到要修改的数据的 id
# 根据返回的 id 到新的页面进行修改
# post
# 根据 id 修改数据库中的数据
pk = request.GET.get("pk")
pub_obj = models.Publisher.objects.get(pk=pk)
if request.method=="GET":
return render(request, "publisher_change.html", {"pub_obj":pub_obj})
else:
pub_name = request.POST.get('pub_name')
pub_obj.name = pub_name # 只是在内存中修改了
pub_obj.save() # 在数据库中修改
return redirect('/publisher_list/')
5. 模板语法
{{ k1 }}
{% for i in all_publishers %}
{{ forloop.counter }}
{{ i.name }}
{{ i.pk }}
{{ i.id }}
{% endfor %}