django web开发(三)初识django 基础

Django

1 django安装

pip install djiango

1.1 python目录

:/python37
	- python.exe
	- scripts
		- pip.exe
		- django-admin.exe		[工具,创建django项目中的文件和问价夹]

	-lib
		- 内置模块
		- site-packages
			- openpyxl
			- flask
			- django			[框架的源码]
		

2 创建项目

  1. 打开终端进入某个目录
cd D:/...
  1. 执行创建命令
 django-admin startproject 项目名称

2.1 pychrm创建

在这里插入图片描述
在这里插入图片描述

2.2 django项目目录

web
├── db.sqlite3
├── manage.py			# 项目的管理,包括: 启动项目,创建app, 数据管理 [不动]
└── web
    ├── __init__.py
    ├── settings.py		# 项目配置(模板配置,数据库配置,注册app) 【!】
    ├── urls.py			# url和函数的对应关系					【!】
    ├── asgi.py			# 接收网络请求 				 [不动]
    └── wsgi.py			# 接收网络请求				 [不动]
	

3 创建app

3.1 终端创建app

 django-admin  startapp app01    

在这里插入图片描述

3.2 app 目录

-app011
├── __init__.py
├── admin.py			映射models中的数据到Django自带的admin后台。
├── apps.py				在新的Django版本中新增,用于应用程序的配置。app启动类
├── migrations 			用于记录models /(数据库)中数据的变更。
│   └── __init__.py
├── models.py			创建应用程序数据表模型  【!】对应数据库的相关操作。
├── tests.py			创建Django测试。单元测试
└── views.py			控制向前端显示那些数据   【!】试图函数

4 快速上手

4.1 注册app

在这里插入图片描述
settings.py 添加

 'app01.apps.App01Config'

在这里插入图片描述

4.2 编写url和函数关系[url.py]

在这里插入图片描述

4.3 编写视图函数

在这里插入图片描述

4.4 启动django程序

  • 命令行启动(配置了pychrm终端的环境变量)
 python manage.py runserver 
  • Pycharm启动
    在这里插入图片描述在这里插入图片描述

总结

app目录下.
新建templates文件夹存放html文件

在这里插入图片描述

写的时候的关键代码:

url.py

from tj import views


urlpatterns = [

    # 访问.../index/ -->执行views中index函数
    path('login/', views.login),
    ]

views.py
render内部读取html到内存,并返回给用户

from django.shortcuts import render, HttpResponse

def login(request):
    return render(request, "login.html ")

注意:html寻找顺序:

settings.py 中的TEMPLATES = [ ]写了
‘DIRS’: [os.path.join(BASE_DIR , ‘…/…/TableIdentification/templates’)],

  1. 有限在根目录下的templates中寻找
  2. 根据app注册顺序,在每一个app下的template目录中寻找

‘DIRS’: [],

不在根目录下寻找,直接去app目录下寻找templates

在这里插入图片描述

静态文件

新建static 文件存放静态文件

在这里插入图片描述

tj       			  app名字
├─migrations
│  └─__pycache__
├─static     		静态文件
│  ├─css
│  ├─img
│  ├─js
│  └─plugins
│      ├─bootstrap
│      │  ├─css
│      │  ├─fonts
│      │  └─js
├─templates				html代码         
└─__pycache__

{% load static %} html存入内存后起作用:将static加载过来
相对路径
href="{% static ‘已经在static路径下/… %}’ 占位符 执行static函数
在这里插入图片描述

html模板

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap/css/bootstrap.css'%}">
</head>
<body>
<input type="text" class="btn btn-primary" value="asd">

<img src="{% static 'img/senlin.jpg' %}">


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

在这里插入图片描述

5 模板语法

本质:在html上写一些占位符,由数据对这些占位符进行替换和处理

传递变量

在这里插入图片描述在这里插入图片描述

列表

在这里插入图片描述

在这里插入图片描述

列表循环

<div>
    {% for i in l %}
        <span>列表i:{{ i }}</span>
    {% endfor %}
</div>

在这里插入图片描述

字典

def test(request):
    dist = {"name": 0, "age": 203,"ad": "ad0"}
    return render(request, 'test.html',
                  {
                   "d": dist
                   })

<div>{{ d.name }}</div>
<div>{{ d.age }}</div>
<div>{{ d.ad }}</div>

在这里插入图片描述

字典循环

keys

<div>
    {% for k in d.keys%}
        <h5>{{ k }} </h5>
    {% endfor %}
</div>

在这里插入图片描述values


<div>
    {% for v in d.values%}
        <h5>{{ v }} </h5>
    {% endfor %}
</div>

在这里插入图片描述
k@v

<div>
    {% for k,v in d.items %}
        <h5>{{ k }} ::{{ v }}</h5>
    {% endfor %}
</div>

在这里插入图片描述

列表套字典

def test(request):

    data_l = [
        {"name": 1, "age": 23, "ad": "ad1"},
        {"name": 2, "age": 23, "ad": "ad2"},
        {"name": 3, "age": 23, "ad": "ad3"}
    ]

    return render(request, 'test.html',
                  {
                   "dl": data_l
                   })

<div>
    {{ dl.0.ad }}
    {{ dl.1.age }}
    {{ dl.2.ad }}
</div>

{% for i in dl %}
    <div>{{ i.name }} {{ i.ad }}</div>
{% endfor %}

在这里插入图片描述

条件判断

{% if d1 == 'c/window' %}
    <h5>if</h5>
{% else %}
    <h5>else</h5>
{% endif %}
    <h5>endif</h5>

在这里插入图片描述

6 请求和响应

重定向: 浏览器向某个网站发送请求,网站返回给浏览器一个新的URL,浏览器去访问这个新的URL地址
修改blog下的views.py, 根据情况去掉下面代码的注释进行测试

# 导入 redirect 包(重定向)
from django.shortcuts import render, redirect
...

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

    # 1.[请求]获取请求的方式
    print("用户请求的方式: " + request.method)

    # 2.[请求]在URL上传递值, 例如: http://123.249.26.154:5900/something/?n1=1&n2=2
    print(request.GET)

    # 3.[请求]在请求体中提交数据,目前是空值
    print(request.POST)




    # 4.[响应]HttpResponse("返回内容"), 内容字符串内容返回给请求者
    # return HttpResponse("返回内容")

    # 5.[响应]读取HTML的内容 + 渲染(替换) => 字符串,返回给用户浏览器
    # 需要在 blog/templates 下新建`something.html`
    #return render(request, 'something.html', {"title": "hello"})

    # 6.[响应] 让浏览器重定向到其他的页面 
    return redirect("http://www.baidu.com")

在这里插入图片描述

案例:用户登录

url.py添加

    path('login/', views.login),

views.py


def login(request):
    if request.method == "GET":
        return render(request, "login.html")

    print(request.POST)
    u = request.POST.get("user")
    p = request.POST.get("pwd")
    if u == "root" and p == "123":
        # return HttpResponse("登录成功")
        return redirect("http://www.baidu.com")
    # return HttpResponse("登录失败")
    return render(request,"login.html",{"error":"pwd or user error"})


{% csrf_token %} 必须加上
否则:

在这里插入图片描述
创建login.html

action 为提交表单给谁,/login/ 就可以找到views.py中 def login() 函数

</h1>用户登录</h1>
<form method="post" action="/login/">

        {% csrf_token %}

    <input type="text" name="user" placeholder="用户名">
    <input type="password" name="pwd" placeholder="密码">
    <input type="submit" value="提交">
    <span style="color: red">{{ error }}</span>
</form>

浏览器访问,输入错误的用户名和密码,输对跳转百度
在这里插入图片描述

7 数据库操作

Django开发操作数据库更简单,内部提供了ORM框架

  • 安装第三方模块 mysqlclient

参考链接: https://blog.csdn.net/m0_67155975/article/details/123138225

yum -y install mysql-devel
yum -y install python-devel
pip3 install mysqlclient

在这里插入图片描述

  • 官网下载https://pypi.org/project/mysqlclient/#files
    在这里插入图片描述

orm框架

创建/修改/删除数据库中的表(无法创建数据库)
操作表中的数据 (非sql语句)

  • 创建数据库
create database mydb DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  • 链接数据库

    注释掉
    在这里插入图片描述添加

# 链接数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

Django操作表

在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 tj_useringo(
#     id bigint auto_increment primary key,
#     name varchar(32),
#     password vachar(64)
#     age int
# );

在服务器中项目根目录下执行命令

python3 manage.py makemigrations
python3 manage.py migrate

会根据自定义的类创建跟【app_类名】的表

遇到问题:版本不兼容
django.db.utils.NotSupportedError: MySQL 5.7 or later is required (found 5.6.47).
在这里插入图片描述
django版本降级
豆瓣镜像安装

pip3 uninstall django

pip install django==2.1.12 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

遇到问题:
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
增加models.py代码
import pymysql
pymysql.install_as_MySQLdb()


import pymysql
pymysql.install_as_MySQLdb()

# 链接数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'bm',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': '127.0.0.1',
        'PORT': '3306'
    }
}

执行成功
在这里插入图片描述
在这里插入图片描述

修改表结构

如果不想要某个表,将class类注释后,重新执行两个命令即可
修改直接在类中修改,重新执行命令
在表中新增列时,新增列需要指定对应数据

  1. 手动输入默认值
    在这里插入图片描述
    在这里插入图片描述

  2. 设置默认值

    data= models.IntegerField(default=2)
  1. 允许为空
    data= models.IntegerField(null=True,blank=True)

重新执行

python manage.py makemigrations
python manage.py migrate

修改数据

1.views.py


from tj.models import UserInfo    #引入类


def xxorm(request):
    UserInfo.objects.create(name="ormcreat", password="orm", age="20")

    return render(request, "xxorm.html")

在访问…/xxorm/时自动添加到数据库

2.models.py

UserInfo.objects.create(name="djcreat", password='dj', age=99)

执行
python manage.py makemigrations
python manage.py migrate
或者访问页面
添加到数据库
在这里插入图片描述

一下都在views.py下进行

	# 删除数据
    UserInfo.objects.filter(id=2).delete()
    # 删除表中所有数据
    UserInfo.objects.all().delete()

UserInfo.objects.filter(name="roker").update(age=35)


  • 获取所有数据
    data_list 为QuerySet数据类型
    类似列表
data_list = UserInfo.objects.all()
print(data_list)
for obj in data_list:
    print(obj.id, obj.name, obj.password, obj.age)

在这里插入图片描述筛选获取数据

    d1 = UserInfo.objects.filter(id = 4)

    print(d1[0].id, d1[0].name, d1[0].password, d1[0].age)
    return render(request, "xxorm.html")

在这里插入图片描述如果只有一行数据,后面可以加.first直接得到行数据

 row_obj = UserInfo.objects.filter(id = 4).first()

案例:用户管理

展览

url.py

    path('xxorm/', views.xxorm),

views.py

    datalist = UserInfo.objects.all()
    if request.method == "GET":
        return render(request, "xxorm.html",{'datalist':datalist})

xxorm.html


    <table>
        <thead>
            <tr>
                <th>Id</th>
                <th>Name</th>
                <th>passward</th>
                <th>age</th>
                <th>data</th>
            </tr>
        </thead>
        <tbody>
        {% for i in datalist %}
            <tr>
                <td>{{ i.id }}</td>
                <td>{{ i.name }}</td>
                <td>{{ i.password }}</td>
                <td>{{ i.age }}</td>
                <td>{{ i.data }}</td>
            </tr>
        {% endfor %}
        </tbody>

        </thead>
    </table>

增加

views.py


    id = request.POST.get("id")
    name = request.POST.get("name")
    password = request.POST.get("password")
    age = request.POST.get("age")
    UserInfo.objects.create(id = id, name = name, password = password, age = age )
    datalist = UserInfo.objects.all()
    return render(request, "xxorm.html",{'datalist':datalist})

xxorm.html

<form  action="/xxorm/" method="post" >
     {% csrf_token %}
    <input type="text" name="id"  placeholder="id" >
    <input type="text" name="name"  placeholder="name">
    <input type="text" name="password"  placeholder="pwd">
    <input type="text" name="age"  placeholder="age">
    <input type="submit" value="提交">
</form>

删除

views.py
点击删除,GET请求中存在id=“??”,delid会接受传过来的要删除的id
如果不是点的删除的get请求,delid为None,不会执行.delete()操作

    datalist = UserInfo.objects.all()
    if request.method == "GET":
        delid=request.GET.get("id")
        if  bool(delid):

            UserInfo.objects.filter(id=delid).delete()
            datalist = UserInfo.objects.all()
        return render(request, "xxorm.html",{'datalist':datalist})

xxorm.html

        {% for i in datalist %}
            <tr>
                <td>{{ i.id }}</td>
                <td>{{ i.name }}</td>
                <td>{{ i.password }}</td>
                <td>{{ i.age }}</td>
                <td>
                    <a href="/xxorm/?id={{ i.id }}">删除</a>
                </td>
            </tr>
        {% endfor %}

完整案例

views.py

def xxorm(request):
    datalist = UserInfo.objects.all()
    if request.method == "GET":
        delid=request.GET.get("id")
        if  bool(delid):
            UserInfo.objects.filter(id=delid).delete()
            datalist = UserInfo.objects.all()
        return render(request, "xxorm.html",{'datalist':datalist})


    id = request.POST.get("id")
    name = request.POST.get("name")
    password = request.POST.get("password")
    age = request.POST.get("age")
    UserInfo.objects.create(id = id, name = name, password = password, age = age )
    datalist = UserInfo.objects.all()
    return render(request, "xxorm.html",{'datalist':datalist})

xxorm.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        form{
            margin:30px;
        }
    </style>
</head>
<body>
<h1>orm测试</h1>

<form  action="/xxorm/" method="post" >
     {% csrf_token %}
    <input type="text" name="id"  placeholder="id" >
    <input type="text" name="name"  placeholder="name">
    <input type="text" name="password"  placeholder="pwd">
    <input type="text" name="age"  placeholder="age">
    <input type="submit" value="提交">
</form>


    <table>
        <thead>
            <tr>
                <th>Id</th>
                <th>Name</th>
                <th>passward</th>
                <th>age</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
        {% for i in datalist %}
            <tr>
                <td>{{ i.id }}</td>
                <td>{{ i.name }}</td>
                <td>{{ i.password }}</td>
                <td>{{ i.age }}</td>
                <td>
                    <a href="/xxorm/?id={{ i.id }}">删除</a>
                </td>
            </tr>
        {% endfor %}
        </tbody>

        </thead>
    </table>


</body>
</html>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django是一个高级的Python Web框架,它具有完整的MVC架构、易于拓展、高效、模块化、安全性高等优点。Django诞生于2003年,由德国人Adrian Holovaty和美国人Simon Willison在比利时首都布鲁塞尔创建,目的是为了开发新闻类网站。现在它已成为Python Web开发中最受欢迎和最成熟的框架之一,许多大公司都在使用Django进行Web开发Django的设计理念是DRY(Don't Repeat Yourself),即不重复原则,它的核心思想是将固定的模块化功能封装起来,让开发者更加关注业务逻辑的实现。Django支持ORM方式对数据库进行操作,它可以自动创建数据库结构,还可以自动验证数据。Django还提供了内置的管理后台,可以快速创建一个管理后台,实现增删改查等基本操作。同时,Django还拥有强大的验证和安全机制,能够防止SQL注入等常见的攻击方式。 Django的拓展性很高,提供了很多方便的插件和工具,通过pip安装即可使用,如Django REST framework可以轻松实现RESTful API,Django Haystack可以方便地连接搜索引擎。Django也提供了强大的缓存机制,支持内存、文件、数据库等多种缓存方式,并且可以轻松实现分布式缓存。 总之,Django是一种高效、灵活和可扩展的Web开发框架,无论你是小型企业还是大型企业,使用Django进行开发都能够让你的Web应用更加高效、安全、易于拓展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值