Django(二)

目录
  • Django(二)
    • 静态文件
    • 静态文件配置及访问顺序
    • 动态解析
    • request对象方法
    • request方法
    • Django连接MySQL
  • Django ORM
    • ORM实操之数据库迁移
    • ORM实操之字段的修改
    • ORM实操之数据的增删改查

Django(二)

Django(二)_第1张图片

静态文件

什么是静态文件?

  • 静态文件:写好的文件不会动态改变的文件资源,比如CSS文件,Js文件,图片文件,第三方框架等·····
  • 墨守成规的将这些文件放在自创static文件夹中,在静态文件夹中创建CSSJSimgothers文件夹·····

配置静态文件,拿第三方框架bootstrap来举例,如果用到静态文件,需要在settings.py配置,配置好bootstrap的绝对路径只从写根目录写起就ok啦!

再需要写静态文件,在static中写就了!

'''settings.py'''
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

示例:登录

'''urls.py'''
from django.contrib import admin
from django.urls import path
from app01 import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),

]

'''views.py'''
from django.shortcuts import render

# Create your views here.
def  login(request):
    return render(request,'login.html')



    
    Title
    
    
    


    

用户登录

ps:配置静态文件完成后,那么在static文件下的文件都可以通过路径来访问到,eg:127.0.0.1:8000/static/a.txt

ps:如果Django主页面不能访问了,在urls.py文件中写一个默认的对应关系补充

Django(二)_第2张图片

静态文件配置及访问顺序

静态文件

STATIC_URL = '/static/'  # 接口前缀,不是文件名,类似"令牌"

'''
如果你想要访问静态文件资源必须以static开头,如果写了接口前缀之后,下面的静态配置文件下的文件都能够访问
'''
# 静态文件配置,可以写多个,访问的顺序是从上往下依次查找
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2'),
]

动态解析

涉及到接口前缀的修改繁琐的问题,那么现在使用动态解析的语法来实现,修改了接口前缀也能够动态解析,从而不需要挨个文件的修改!








{% load static%}
    
    

Django(二)_第3张图片

request对象方法

提交表单出现403错误,如何解决?

Django(二)_第4张图片

settings.py文件注释掉'django.middleware.csrf.CsrfViewMiddleware',就可以了

request方法

  • request.method:获取当前请求方法
  • request.body:以二进制的形式返回用户提交的数据
  • request.POST:以字典的形式返回用户提交的数据
from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def  login(request):
    print(request.method, type(request.method))  # GET 
    if request.method=='POST':
        return HttpResponse('POST请求返回结果!')
    return render(request,'login.html')   # GET请求返回页面

注意:request.POST返回的字典用get方法获取列表形式的value,返回的是字符串,get方法只会取列表的最后一个元素

# 在获取用户多选或者提交的信息是多条,返回在一个列表内如何获取用户数据呢?
使用request.POST.getlist方法,返回一个列表,就不再使用get方法了

def  login(request):
    print(request.method, type(request.method))  # GET 
    print( request.POST)
    print( request.POST.get('Email'))
    print( request.POST.getlist('Email'))
    if request.method=='POST':
        return HttpResponse('POST请求返回结果!')
    return render(request,'login.html')   # GET请求返回页面

GET请求方式的方法是一样的

如何获取URL?后面的参数?

request.GET方法:和request.POST方法是一样的,返回字典

request.GET.get(k):获取字典的value,返回字符串

request.GET.getlist(k):获取用户数据,获取到整个列表

文件对象如何获取??

针对表单提交的文件对象,如何获取?这里不能使用request.POST或者request.GET方法,使用request.FILES方法,返回结果看成字典即可

  • 获取表单提交文件对象的方法:request.FILES

方法有了,返回的是空字典,在表单中添加enctype参数,再提交就可以获取到文件对象

Django连接MySQL

Django默认使用的数据库是sqlite3,这里介绍如何使用Django连接MySQL数据库

1、修改配置文件

# 默认的情况settings.py文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
# 修改配置文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '数据库',
        'HOST':'ip地址',
        'PORT':3306,
        'USER':'用户名',
        'PASSWORD':'密码',
        'CHARSET':'utf8'
    }
}
# 数据库使用是提前创好的!!!

2、在项目文件夹或应用文件夹中的__init__.py文件书写固定的代码

Django(二)_第5张图片

'''__init__.py'''
import pymysql
pymysql.install_as_MySQLdb()

如果报错: query = query.decode(errors='replace') AttributeError: 'str' object has no attribute 'decode'

解决办法:query = query.decode(errors='replace')提换成query = errors = 'replace'


Django ORM

ORM:对象映射关系程序

通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言;

python与MySQL映射关系

Python 映射 MySQL
------->
对象 -------> 表里面的数据
对象点属性 -------> 字段对应的值

ORM实操之数据库迁移

我们的模型类需要写在应用下的models.py文件中

# SQL原生语句和ROM创建的区别

class User(models.Model):
        # id int primary key auto_increment
        id = models.AutoField(primary_key=True)
        # name varchar(32)
        name = models.CharField(max_length=32)  # CharField必须要加max_length参数
        # age int
        age = models.IntegerField()

✨✨✨数据库迁移命令(重点)

  • 只要修改了models.py文件执行了和数据库相关的命令,就重新执行下面这两条命令:python3 manage.py makemigrations、python3 manage.py migrate
  • 或者打开Tools,点击RUN manage.py Task,输入makemigrations
 1.将数据库修改操作先记录到"本本"(对应应用下的migrations文件夹)
    python3 manage.py makemigrations
# 执行完,产生一个文件,用来记录 
2.真正的执行数据库迁移操作,同步到数据库
	python3 manage.py migrate
# 执行完会在数据库中产生Django所需的依赖表,自动创建的 
# 自己创建的表user以'应用名_表名'的形式创建,app01_user

✨✨不指定id字段和主键等,ORM会自动创建id

# 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
class user(models.Model):
    username = models.CharField(max_length=32)
    
# 就不用写id了···,需要定制id,就写上~

ORM实操之字段的修改

# 原来的表
class user(models.Model):
     username = models.CharField(max_length=32)
        
# 增加字段(两种方法)
	password = models.IntegerField('密码',null=True)  # 该字段可以为空
    is_delete = models.IntegerField(default=0)   # 默认值
    
# 修改字段
直接改代码,然后执行makemigrations,数据库迁移
# 删除
直接删除或者注释掉代码,然后执行makemigrations,数据库迁移

ORM实操之数据的增删改查

# 1.查询数据
# select * from user where name=username;
user_obj = models.User.objects.filter(name=username).first()

# 2.添加数据
# insert into user(name,pwd) values(username,password);
models.User.objects.create(name=username,pwd=password)

# 3.查询所有的数据
# select * from user;
models.User.objects.all()  # [obj1,obj2,obj3,obj4]

# 4.修改数据
models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()

# 5.删除数据
models.User.objects.filter(id=delete_id).delete()

你可能感兴趣的:(Django(二))