django相关操作

由写一个登录页面的前后端来引出知识点

路由相关

路由介绍

可以将其视为网址 http://127.0.0.1:8000/login

路由访问时不加斜杠,内部会重定向加斜杠的路由

http://127.0.0.1:8000/login

如此发送给到服务器的get数据中的路由字段为 login,但是django中urls的路由与试图映射的数据是 login/ 是带有 / 斜杠的,这时首先会拿login到服务端比对,若没有则加上 / 斜杠再进行比对(http://127.0.0.1:8000/login/),有则进入页面,无则报错

静态文件相关

所有的html文件默认都写在templates文件夹下

所有静态文件(CSS,JS, 前端第三方类库)默认都放在static文件夹下,这个文件夹需要自己手动创建,创建在跟app/项目同层的文件夹

html引入外部资源的方式

cdn

本地

静态文件配置

# 在settings文件中找到STATIC_URL:

# 接口前缀,跟静态文件夹一点关系都没有,默认情况下这个前缀跟静态文件夹名字一样!!!
STATIC_URL = "/static/"  # 这个static是用来识别路由的后缀的
STATICFILES_DIR = [
    os.path.join(BASE_DIR, "static")  # 这个static是用来拼接文件夹路径的,上面的识别成功,然后走下面的路径去找数据
    os.path.join(BASE_DIR, "static1") 
    os.path.join(BASE_DIR, "static2") 
]

# ps:会依次查找列表中所有的静态文件路径,找到的话立刻停止,都没有找到返回404

form表单相关

form表单数据提交数据的两种方式

<input type="submit">
<button></button>

form提交数据的地址如何指定

由form标签中的action属性控制提交地址
方式:
	1、全路径
		<form action="http://127.0.0.1:8000/login/">
		</form>
	2、只写路径后缀
		<form action="/login/">
        </form>
	3、不写(默认往当前路径提交)

form表单数据的提交方式的更改

提交方式有两种:get | post
form表单默认的是get请求

但是get请求会造成用户隐私(重要信息)显现在路由上,而post提交方式则不会
更改form表单提交方式的方法:
	由form表单中的method属性控制提交方式:
	<form action="" mothod="post">
	</form>

根据客户端请求方式的不同-执行不同的逻辑代码

def login(request):  # 用户端提交的数据全部都在request中,包括请求方式,还有用户个人数据,以及路由地址等等
    # 获取用户端提交的请求方式
    print(request.mothod):
    if request.method == "POST":  # 拿到的请求方式是全大写的字符串
        return HttpResponse("OK")
    return render(request, "login.html")  # 在此之上应为post请求的逻辑代码

如何获取客户端提交的form表单数据

def login(request):
    if request.mothod == "POST":
        print(request.POST)  # 将其当成一个大字典即可,里面存放了客户端post提交的所有数据
        # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >
        print(request.POST.get("username"))  # jason  # 虽然上面的username的value是一个列表,但是却拿到了一个字符串,原因是此处的 .get()方法默认只会取value列表最后一个元素
        '''
        若request.POST数据中的value列表有多个值:
        request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}>
        当form表单中有多选的数据是就需要把值全部取出来,那么就要用到:.getlist()
        '''
        print(request.POST.getlist("username"))  # ['jason', 'egon']  # 想要一次性获取value列表里面的所有数据需要用到 getlist()
        print(request.POST["username"])  # 不推荐使用此方法获取数据
        return HttpResponse("OK")
    return render(request, "login.html")

'''
总结:
	获取value列表中的所有元素需要使用getlist  应用场景:用户的爱好 多选框
	get 只会获取到value列表中的最后一个元素
'''

django连接数据库相关

使用django连接数据库必须完成两个步骤

# 第1步:需要修改配置文件
# 找到settings文件中的 DATABASES
# 将其修改为:
DATABASES = {
    "default":{
        "ENGINE":"django.db.backends.mysql",
        "NAME":"day54",  # 此为要连接的库名
        "HOST":"127.0.0.1",
        "POST":3306,
        "USER":"root",
        "PASSWORD":"123"
    }
}

ps:键都必须为大写
# 第2步:告诉django用pymysql替换他默认的mysqldb模块来连接数据库
# 可以写在:
	1、项目文件夹下面的__init__.py
    2、也可以在app应用文件夹下面的__init__.py
    
# 固定写法
import pymysql
pymysql.install_as_MySQLdb()  # 告诉django用pymysql代替mysqldb连接数据库

ORM相关

什么是ROM

对象关系映射
	类   >>>   表
	对象   >>>   表记录
	对象的属性   >>>   一条记录某个字段对应的值

django的orm不能够自动创建库,但是可以自动创建表
ps:一个django项目就使用一个库,不要多个django项目使用一个库

数据库迁移(同步)命令 (****************)

# 此命令分为分布,有1必有2,必须配合执行: 在终端中运行
python3 manage.py makemigrations  # 将你的数据库变动记录到一个小本本上(并不会帮你创建表)
python3 manage.py migrate  # 将你的数据库变动同步到数据库中

ROM中对于数据库数据的增删改查

新增数据

# 操作数据库user表插入数据
# 方式一:
# user_obj = models.User.objects.create(字段1=字段1的值, 字段2=字段2的值...)  # 伪代码
user_obj = models.User.objects.create(name=username,password=password)

# 方式二:
# user_obj = models.User(字段1=字段1的值, 字段2=字段2的值...)  # 伪代码
user_obj = models.User(name=username, password=password)
user_obj.save()  # 对象调用sava方法保存到数据库

查询数据

user_list = models.User.objects.all()  # 获取user表所有的数据
# 只要是QuerySet对象,就介意点query查看到当前QuerySet对象的内部sql语句
print(user_list.query)  # select id,name,password form user;

查询数据需要注意的是 你想要获取QuerySet对象还是一个数据对象
user_query = models.User.objects.filter(id=edit_id).first()  # 如果你是要获取数据对象那么 .first()别忘了
.filter()当条件不存在的情况下会返回一个空的QuerySet对象
<QuerySet []> <class 'django.db.models.query_QuerySet'>
user_obj = models.User.objects.get(id=edit_id)  # 用get可以直接获取到数据对象本身,但是查询条件不存在的情况下会直接摆错

QuerySet对象支持索引取值,但是不推荐使用,推荐使用自带的 .first() 来获取第一条数据

修改数据

# 编辑对象的id的获取方式
# 方式一:利用input隐藏一个标签
<input type="hidden" name="edit_id" value="a{{ user_obj.pk }}">
# 方式二:将数据放到form表单发送数据的路由地址的后缀中去
<form action="/edit/?edit_id={{ user_obj.pk }}" method="post">
    
# 注意:QuerySet对象点修改|删除会作用与对象内部所有的数据对象  类似于批量操作
方式一:
	models.User.objects.filter(id=edit_id).update(name=username,password=password)
方式而:
    user_obj = models.User.objects.filter(id=edit_id).first()
    user_obj.name = username
    user_obj.save()

删除数据

models.User.objects.filter(id=1).delete()  # 会将QuerySet所有的数据对象全部删除

一旦修改模型层里面跟表相关的所有数据(models.py中的与表对应的类),就必须重新执行数据库迁移命令

Python3 manage.py makemigrations # 记录到小本本

python3 manage.py migrate # 真正操作数据库

页面跳转

利用a标签href属性 可以指定页面跳转的路径  href可以写全路径 但推荐写后缀即可
<a href="/reg/" class="btn btn-success">添加数据</a>
# 注意 路径的书写一定要加斜杠

重定向  可以写别人的网址  也可以是自己的路径
return redirect("/userlist")
return redirect("/userlist/")
posted @ 2019-06-06 21:21  输诚  阅读(103)  评论(0编辑  收藏  举报