Django_学习笔记

Django

打印sql日志

python 复制代码
from django.db import connection

print(connection.queries[-1])


# setting.py
DEBUG = True
LOG_LEVEL = os.environ.get("LOG_LEVEL", "DEBUG")
安装Django
cmd 复制代码
pip2.7 install django
# 注意,视频的django是3.4.1,现在使用pip3.9安装的是4.2
pip3.9 install django
 pip3.9 uninstall django 
 
pip3.9  install Django==3.2.9

/Library/Frameworks/Python.framework/Versions/2.7/bin/django-admin.py
/Library/Frameworks/Python.framework/Versions/2.7/bin/django-admin.pyc
/Library/Frameworks/Python.framework/Versions/2.7/bin/django-admin
创建Django项目
cmd 复制代码
 cd /Users/jiayuchao/office/PycharmProjects/
 
 /Library/Frameworks/Python.framework/Versions/3.9/bin/django-admin startproject TestDjango3915
默认目录结构介绍
cmd 复制代码
TestDjango
├── TestDjango
│   ├── __init__.py	
│   ├── settings.py	【项目配置】 【常常修改】
│   ├── urls.py		【URL和函数的对应管理】 【常常修改】
│   └── wsgi.py		【同步 接收网络请求】【不要动】
│ 	└── asgi.py		【异步 接收网络请求】【不要动】
└── manage.py		【项目的管理,启动项目、创建app、数据管理】【不要动】
app【类似于JAVA的模块概念】
markdown 复制代码
- 项目
	- app, 用户管理【表结构、函数、HTML模版、CSS】
	- app, 订单管理【表结构、函数、HTML模版、CSS】
	- app,后台管理【表结构、函数、HTML模版、CSS】
	- app,网站【表结构、函数、HTML模版、CSS】
	- app,API【表结构、函数、HTML模版、CSS】
	
- 创建app
 python3.9 manage.py startapp  app01
 python3.9 manage.py startapp  app02
app目录
复制代码
├── app01
│   ├── __init__.py
│   ├── admin.py					【固定,不用动】django默认提供的admin后台管理
│   ├── apps.py						【固定,不用动】 app启动类
│   ├── migrations				
│   │   └── __init__.py
│   ├── models.py					【重要】,对数据库操作
│   ├── tests.py					【固定,不用动】单元测试
│   └── views.py					【重要】,函数
app注册
markdown 复制代码
在settings.py中添加配置
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
]
编写URL和函数对应关系【urls】
python 复制代码
from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('index/', views.index),
]
编写具体的函数
python 复制代码
from django.shortcuts import render,HttpResponse

def index(request):
    return HttpResponse('欢迎使用')
启动djiango项目
python 复制代码
python3.9  manage.py runserver
再写一个页面
python 复制代码
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('index/', views.index),
    path('user/list', views.user_list),
    path('user/add', views.user_add),
]
templates模版
python 复制代码
def user_list(request):
    return render(request,'user_list.html')

# 优先去根目录寻找(在配置了setting.py的dirs之后)
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
# 根据app注册顺序,在app目录下的templates查找user_list.html文件
静态文件
python 复制代码
{% load static %}
<html>
<head>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">
</head>

    <h1>添加用户</h1>
<img src="/static/img/pic1.png"/>
<img src="{% static 'img/pic1.png' %}"/>

<input type="text" class="btn btn-primary" value="新建"/>

<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
</html>

├── static
│   ├── css
│   ├── img
│   │   └── pic1.png
│   ├── js
│   │   ├── jquery-3.6.0.js
│   │   └── jquery-3.6.0.min.js
│   └── plugins
│       └── bootstrap-3.4.1
│           ├── css
│           │   ├── bootstrap-theme.css
│           │   ├── bootstrap-theme.css.map
│           │   ├── bootstrap-theme.min.css
│           │   ├── bootstrap-theme.min.css.map
│           │   ├── bootstrap.css
│           │   ├── bootstrap.css.map
│           │   ├── bootstrap.min.css
│           │   └── bootstrap.min.css.map
│           ├── fonts
│           │   ├── glyphicons-halflings-regular.eot
│           │   ├── glyphicons-halflings-regular.svg
│           │   ├── glyphicons-halflings-regular.ttf
│           │   ├── glyphicons-halflings-regular.woff
│           │   └── glyphicons-halflings-regular.woff2
│           └── js
│               ├── bootstrap.js
│               ├── bootstrap.min.js
│               └── npm.js
模版语法python
python 复制代码
def tpl(request):
    name = '超超11'
    roles = ['admin', 'system', 'auditor']
    user_info = {'name': '宇超', 'age': 18, 'role': 'admin'}

    data_list = [
        {'name': '郭智', 'age': 19, 'role': 'system'},
        {'name': '卢慧', 'age': 20, 'role': 'auditor'},
        {'name': '赵建先', 'age': 21, 'role': 'admin'},
    ]

    dict_obj = {'n1': name, 'n2': roles, 'n3': user_info, 'n4': data_list}

    return render(request, 'tpl.html', dict_obj)
模版语法HTML
python 复制代码
 <html>
<div>{{ n1 }}</div>
 <br/>

<div>{{ n2.0 }}</div>
<div>{{ n2.1 }}</div>
<div>{{ n2.2 }}</div>
 <br/>

<div>{{ n3.name }}</div>
<div>{{ n3.age }}</div>
<div>{{ n3.role }}</div>
 <br/>

<div>{{ n4.0.name }}</div>
<div>{{ n4.1.name }}</div>
<div>{{ n4.2.name }}</div>
 <br/>

<div>
    {% for item in n2 %}
        <span>{{ item }}</span>
    {% endfor %}
</div>
 <br/>


<div>
    {% for k,v in n3.items %}
        <span>{{ k }}</span>
        <span>{{ v }}</span>
        <br/>
    {% endfor %}
</div>

<div>
    {% for item in n3.key %}
        <span>{{ item }}</span>
        <br/>
    {% endfor %}
</div>

<div>
    {% for item in n3.value %}
        <span>{{ item }}</span>
        <br/>
    {% endfor %}
</div>
<br/>

<div>
    {% for item in n4 %}
        <span>{{ item.name }}</span>
        <span>{{ item.age }}</span>
        <span>{{ item.role }}</span>
        <br/>
    {% endfor %}
</div>

<div>
    {% if n1 == '宇超' %}
        11111
    {% elif n1 == '超超' %}
        22222
    {% else %}
        33333
    {% endif %}
</div>

</html>
请求与响应
python 复制代码
pip3.9 install requests


def something(request):
    # request是一个对象,封装了用户发送过来的所有的请求相关数据

    # 请求方式 get/post
    print(request.method)
    # GET

    # 在URL上传递的值 ?name=jiayuchao&age=18
    print(request.GET)
    # <QueryDict: {'name': ['jiayuchao'], 'age': ['18']}>

    # return HttpResponse("返回内容")
    # return render("返回内容","something.html")
    return redirect("https://www.baidu.com/")
登录案例python
python 复制代码
def login(request):
    if request.method == 'GET':
        return render(request, "login.html")
    print(request.POST)
    name = request.POST.get('user')
    password = request.POST.get('password')
    print('name:%s,password:%s'%(name,password))
    print(f'name:{{name}},password:{{password}}')

    if name == 'jiayuchao' and password == '123':
        return HttpResponse("登录成功!")

    error_obj = {'error': '登录失败'}
    return render(request, "login.html",error_obj)
登录案例html
html 复制代码
<html>
<title>登录</title>
<h1>用户登录</h1>


<form action="/login" method="post">
    {% csrf_token %}
    用户名:
    <input type="text" name="user" placeholder="用户名"/>
    <input type="text" name="password" placeholder="密码"/>
    <input type="submit" placeholder="提交"/>
    {{ error }}
</form>

</html>
数据库操作
markdown 复制代码
pip3.9 install pymysql
# Django有ORM框架
pip3.9 install mysqlclient
安装数据库
markdown 复制代码
# docker desktop 配置镜像加速器
{
  "registry-mirrors": ["https://1n088knj.mirror.aliyuncs.com"]
}

# 下载镜像
docker pull mysql:5.7

# 运行镜像
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d  mysql:5.7



# 本地mysql密码
password
root

# docker跑镜像
docker run  -dit  --name centos7.6   centos:7.6.1810   /bin/bash
安装数据库 brew install mysql@5.7
markdown 复制代码
# mac安装mysqlclient报错
1. 先安装mysql
brew install mysql@5.7
2. 再安装 pkg-config
brew install pkg-config
3. 配置环境变量(vi ~/.zshrc;source ~/.zshrc)
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"
export MYSQLCLIENT_CFLAGS=$(mysql_config --cflags)
export MYSQLCLIENT_LDFLAGS=$(mysql_config --libs)

# brew查看服务状态
brew services list 
brew services start mysql@5.7
brew services stop mysql@5.7

# 创建数据库
create database gx_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

create database vulscan DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

create database galaxy_vulscan_i18n DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
ALTER DATABASE galaxy_vulscan_i18 RENAME TO galaxy_vulscan_i18n;
配置Django的数据库连接-setting.py
python 复制代码
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "gx_day15",
        "USER": "root",
        "PASSWORD": "root",
        "HOST": "127.0.0.1",
        "PORT": "3306",
    }
}
Django操作表
创建表
python 复制代码
#在models.py书写
from django.db import models


class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField

"""
    create table app01_userinfo(
        id bigint auto_increment primary key,
        name varchar(32)
        password varchar(64)
        age int
    )
"""


# 先安装mysqlclient
pip3.9 install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
pip3.9 install mysqlclient

# 改变了你的models.py文件后,创建新的迁移文件。这个命令会检查你的模型定义和当前的数据库结构,然后创建一份用于更新数据库以匹配模型的迁移文件。
python3.9 manage.py  makemigrations
# 迁移文件到数据库的命令,这样数据库就可以进行必要的更新以匹配模型的当前状态。
python3.9 manage.py  migrate

python2.7 manage.py  makemigrations
# 迁移文件到数据库的命令,这样数据库就可以进行必要的更新以匹配模型的当前状态。
python2.7 manage.py  migrate
新增表
python 复制代码
from django.db import models


class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField


class Department(models.Model):
    title = models.CharField(max_length=16)
    
python3.9 manage.py  makemigrations
python3.9 manage.py  migrate
删除表
python 复制代码
# class Department(models.Model):
#     title = models.CharField(max_length=16)
#     year = models.CharField(max_length=16, default=0)

python3.9 manage.py  makemigrations
python3.9 manage.py  migrate
修改表
python 复制代码
# 加入了year字段
class Department(models.Model):
    title = models.CharField(max_length=16)
    year = models.CharField(max_length=16)
#  1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
#  2) Quit, and let me add a default in models.py
选择1给默认值,或者2退出


# 或者加字段的时候直接给默认值,推荐
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField
    # 已有数据默认值为2,不是字段默认值2
    size = models.IntegerField(default=2)
    # 可以为Null
    data = models.IntegerField(null=True, blank=True)


class Department(models.Model):
    title = models.CharField(max_length=16)
    year = models.CharField(max_length=16, default=0)
增删改查数据
python 复制代码
class Department(models.Model):
    title = models.CharField(max_length=16)

    objects = models.Manager()
    
Department.objects.create(title='销售部')
列表
python 复制代码
def department_list(request):
    query_set = Department.objects.all()
    for item in query_set:
        print(item.id,item.title)

    return HttpResponse("列表成功")
单查
python 复制代码
def department_one(request):
    item = Department.objects.filter(id='1').first()
    print(item.id, item.title)

    return HttpResponse("单个查询成功")
python 复制代码
def department_update(request):
    Department.objects.all().update(title='1234')

    return HttpResponse("更新成功")

def department_update_one(request):
    Department.objects.filter(id='4').update(title='1234')

    return HttpResponse("更新成功")
python 复制代码
def department_delete(request):
    # Department.objects.filter(id='1').delete()
    Department.objects.all().delete()

    return HttpResponse("删除成功")
Resultful语法删除
python 复制代码
path('department/<int:nid>/delete', views.department_delete_one),

def department_delete_one(request, nid):
    Department.objects.filter(id=nid).delete()
    return HttpResponse("删除成功")
  
http://127.0.0.1:9000/department/6/delete
外键
python 复制代码
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField
    # 自动生成depart_id的外键 to关联表 to_field关联字段
    # CASCADE自动删除
    depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE,default='4')

    objects = models.Manager()
模版继承
母版
python 复制代码
{% load static %}
<html>
<head>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}">
    {% block css %}{% endblock %}

</head>

<div>
    {% block content %}{% endblock %}
</div>

<script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>

{% block js %}{% endblock %}
</html>
继承母版
python 复制代码
{% extends 'layout.html' %}

{% block css %}
<style>
    .btn{
        fond-size:20px;
    }
</style>
{% endblock %}


{% block content %}

    <h1>添加用户</h1>
    <img src="/static/img/pic1.png"/>

    <input type="text" class="btn btn-primary" value="新建"/>

{% endblock %}


{% block js %}
<h1>底部位置</h1>
{% endblock %}
相关推荐
今天你TLE了吗2 小时前
LLM到Agent&RAG——AI概念概述 第五章:Skill
人工智能·笔记·后端·学习
不做无法实现的梦~2 小时前
显示屏和显卡驱动问题完整解决教程---ubuntu22.04安装显卡驱动解决显示屏黑屏幕问题
linux·学习
Swilderrr2 小时前
学术研读报告:Mem0 面向生产级 AI 智能体的可扩展长期记忆架构
人工智能·学习
乙酸氧铍2 小时前
【imx6ul 学习笔记】移植ubuntu 20.04系统
笔记·学习·ubuntu
鱼鳞_3 小时前
Java学习笔记_Day37(网络编程)
java·网络·笔记·学习
Byron__3 小时前
AI学习_03_LangChain_RAG基础概念
人工智能·学习·langchain
三品吉他手会点灯3 小时前
C语言学习笔记 - 8.C概述 - 学习的目标
c语言·笔记·学习
IT19953 小时前
Dify笔记-Dify离线插件安装
笔记
果粒蹬i3 小时前
把视频内容变成手绘漫画笔记?ClipSketch AI 让小红书创作省事不少
人工智能·笔记·音视频