django基础

django基础

1.创建了app要去INSTALLED_APPS这个里面加载
2.命令行创建的django项目,TEMPLATES,,里面没用加入
   'DIRS': [os.path.join(BASE_DIR, 'templates')],要手动加入
  
pycharm,,在创建项目的时候,在more settings 里面可以创建一个app并且,app的配置是自动加入的

启动项目要么用命令的方式去启动,或者点绿色小箭头
如果绿色小箭头变灰了点即那个倒三角,进去吧项目加进去,这个里面也可以改端口

创建app可以在命令行创建,用命令,还可以用tools下面的 Run magage.py...,这个有自动提示

django三板斧
    -HttpResponse
        返回字符串
    
    -render
        return render(request, 'my_first.html')  # 自动去templates下面找html
        返回html文件
    -redirect
        重定向
        return redirect('https://www.mzitu.com/')


静态文件配置
    我们将html文件默认放在templates下
    我们将网站使用的静态文件(前端写好的框架, bootstrp, jQuery, 图片,)放在static文件夹下
    
如果你的静态资源比如框架这些东西不是从cdn导入的,是从本机文件导入的,
你需要去做一个静态资源配置,在html手动导入你计算机的资源,记住不要去cdn导入
# 静态文件配置
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

  
在浏览器中输入url能看到对应的资源,是因为后端提前开设了该资源的接口
如果访问不到资源,说明后端没用开设该资源的接口

当你在写一个django项目的时候,可能回出现后端代码修改了,但是前端页面没有修改的情况
1.你在用同一个端口开了好几个django项目
2.浏览器缓存

静态文件动态解析: 令牌可以动态修改
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
    
    
request

form表单的action参数
    不写默认朝当前所在的url提交数据
    全写,指名道姓
    只写后缀
    
在前期,我们用django提交post请求,碰到403页面    # 'django.middleware.csrf.CsrfViewMiddleware',这行注掉


def login(request):
    """
    get请求和post请求的处理机制不一样
    :param request:   请求相关的数据对象
    :return:
    """
    # 给前端返回一个登录页面
    # print(request.method)   # 返回请求方式,全大写的字符串形式
    # if request.method == 'GET':
    #     print('get 请求')
    #     return render(request, 'login.html')
    # elif request.method == 'POST':
    #     return HttpResponse('post请求')
    if request.method == 'POST':
        print(request.POST)  # 获取用户提交的post请求数据不包含文件
        # <QueryDict: {'username': ['qwe'], 'password': ['1'], 'hobby': ['111', '222', '333']}>
        username = request.POST.get('username')
        # hobby = request.POST.get('hobby')
        """
        get只能获取到列表的最后一个元素
        getlist拿到整个列表
        
        获取url后面携带的参数,
        print(request.GET)  # 获取用户提交的get数据
        用法和get一样
        """
        hobby = request.POST.getlist('hobby')
        return HttpResponse('post 请求')
    return render(request, 'login.html')


数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'first_django',
        'USER': 'root',
        'PASSWORD': '5201314a',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}
django默认用的是mysqldb模块连接mysql
该模块兼容性不好,,手动改为pymysql
项目名下的__init__.py或者任意的应用文件下的__init__.py 文件中书写代码

Django ORM
ORM 对象关系映射

将类映射成一张表,对象就是一条记录,,对象属性,记录莫格字段对应的值
自己创建的表,我们利用orm创建的表,auth和django开头的都是django默认创建的
我们的表名是你当前models所在的app文件下环线一个你的类名

只要修改了models.py中跟数据库相关的代码,必须执行数据库迁移命令
    # 数据库迁移命令
    # python3 manage.py makemigrations  记录操作
    # python3 manage.py migrate      将操作同步到数据库
    
利用orm实现字段的增删改查
1.当表中已有数据的时候,可以在终端给出默认值
2.增加数据的时候,当表中已有数据,你可以允许为空,也可以指定默认值
3.修改直接修改字段的代码,执行数据库迁移命令
4.对应的字段注释掉,执行数据库迁移(不要轻易操作)

数据的增删改查
查:
 res = models.User.objects.filter(username=username).first()
 filter()括号内可以跟多个参数,连接是默认and连接
增:
(1)
res = models.User.objects.create(username=username, password=password)
这个返回值是当前创建的对象
(2)
user_obj = models.User(username=username, password=password)
    user_obj.save()
/edit_user/?user_id = {{ user_obj.id }}
这样可以拿到点击的主键值,,?后面的不参与路径匹配
return render(request, 'user_list.html', locals())  # locals()默认把当前页面的名称空间全部传到html页面
        # 修改数据库
        # 方式一:
        models.User.objects.filter(id=edit_id).update(username=username, password=password)
        # 只修改被修改的字段
        # 将filter查询出来的所有数据全部更新,是一个批量更新
        
        # 方式二:
        edit_obj.username = username
        edit_obj.password = password
        edit_obj.save()
        # 这个方法当字段特别多的时候效率特别低
        
    models.User.objects.filter(id=delete_id).delets()
    # 批量删除
    
    真正的删除功能应该有一个二次确认,删除数据内部其实并不是真正的删除,我们会给数据添加一个标识字段用来表示当前数据是否被删了

orm如何创建表关系

表与表之间的关系

一对一

多对多

多对一

判断表关系的方法,换位思考

例如:
"""
图书表

出版社表

作者表

作者详细表

作者和图书关系表

图书和出版社是一对多的关系,,外键建在多的一方
书和作者是多对多的关系,所以要创建一张关系表

作者与作者详情表是一对一的
"""


from django.db import models

# Create your models here.

# 创建表关系 先将基表创建出来 然后添加外键字段
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    # 小数总共八位,小数点后面2为
    """
    图书和出版社是一对多,并且书是多的一方,外键字段放在书表
    """
    publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)  # 默认就是与出版社表的主键字段做关联

    """
    如果字段对应的是ForeignKey,那么orm会自动在字段后面加_id,如果你加了_id,orm后面换回加_id
    
    图书和作者是多对多的关系  外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方
    """
    authors = models.ManyToManyField(to='Author')
    """
    authors是一个虚拟字段,主要是用来告诉orm,书记表和作者表是多对多的关系
    让orm创建第三张关系表
    """


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)


class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()


    """
    作者与作者详情是一对一的关系,外键字段建在任意一方都可以,但是推荐你建在查询频率较高的表
    """
    author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
    """
    OneToOneField也会自动加后缀
    """


class AuthorDetail(models.Model):
    phone=  models.BigIntegerField()
    addr = models.CharField(max_length=32)

    
    
"""
orm如何定义三种关系:
publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author')
author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)

多对多的表关系可以有好几种创建方式

"""

django请求周期流程图

F:\python上海老男孩培训--自己笔记\django
posted @ 2021-08-02 19:38  剧终cur  阅读(43)  评论(0)    收藏  举报