1. Django项目创建(web开发初体验)

在Pycharm中创建Django项目

1. 进入Pycharm,创建新的python项目,搭建虚拟环境

点击左上角file --> New project --> 命名新项目 --> create

在这里插入图片描述

建议选择"Virtualenv",搭建虚拟环境,避免以前下载的python库与本项目的库相冲突,在本项目中仅下载需要的库即可。

2. 在新项目(虚拟环境)中下载Django库

2.1 在新项目中,进入命令终端"Terminal"

在这里插入图片描述

注意:查看是否进入新建项目first_try的目录,如果没有,需要通过cd命令先进入新建项目目录当中,再进行接下来的操作。

2.2 利用pip操作下载所需要库

pip install Django  # 下载Django库,其他依赖库以相同的方式下载

3. 创建Django项目

3.1 在命令终端利用Django命令创建

  • 事实上pip安装Django的时候,会默认下载Django的源代码,以及一个Django-admin.exe文件,这个exe就是用来创建Django项目的;

    django-admin startproject My_first_web .  # 创建一个名为My_first_web的Django项目
    
  • 创建成功后,会在项目first_try目录下面出现My_first_web目录,以及manage.py文件;

    first_try
    	|- My_first_web
        |   │  settings.py     【项目配置】    【**时常改动**】
        |   │  urls.py         【配置URL与函数的对于关系】   【**时常改动**】
        |   │  wsgi.py         【接收网络请求】【固定不用动】
        |   │  asgi.py         【接收网络请求】【固定不用动】
        |   │  __init__.py     【固定不用动】
        |-  manage.py      【项目管理、项目启动、创建app、数据管理】【固定不动】
    

3.2 创建app文件夹

python manage.py startapp app01  # 创建一个名为app01的app文件夹
  • 创建成功之后,app01 文件夹下面会出现多个文件,在 view.py 中编写视图函数;

    ├─app01
    │  │  admin.py   【固定不用动】
    │  │  apps.py    【固定不用动】app启动,本质为一个类
    |  |  migrations 【固定不用动】数据库变更记录
    │  │  models.py  【重要】,对数据库进行处理,在Django中封装了orm调用MySQL,不用再下载pymysql
    │  │  tests.py   【固定不用动】单元测试
    │  │  views.py   【重要】,放视图函数
    │  │  __init__.py
    

3.3app01 配置到 My_first_web/My_first_web 路径下的 settings.py 中的 INSTALLED_APPS 当中;

  • 上面3.2提到app01/apps.py本质是一个名为App01Config的类;

    # # apps.py
    
    class App01Config(AppConfig):
        default_auto_field = 'django.db.models.BigAutoField'
        name = 'app01'  # app的名字
    
  • settings.pyINSTALLED_APPS 当中引入app的类app01.apps.App01Config

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',  # 此步骤必不可少,每创建一个新的app文件夹,都需要将其配置到这里面
    ]
    

3.4 设计一个简单的网页HTML

  • 进入view.py,编写视图函数;

    from django.shortcuts import HttpResponse  # 从Django库当中导入HttpResponse
    
    # 创建一个名为test的视图函数,作用为显示文本内容
    def test():
        return HttpResponse('Hello world!')
    
  • 进入 My_first_web/My_first_web 路径下的 urls.py 文件配置url;

    urls.py 中引入自己app中的视图函数:

    from django.contrib import admin
    from django.urls import path
    from app01 import views  # 引入app01中的views视图文件
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('1/', views.test)  # 第一个参数'1/'为url,第二个参数为自己编写的视图函数
    ]
    
  • 生成网页

    python manage.py runserver  # 在命令窗口执行
    

    得到如下网页结果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nrtexbz3-1660955662342)(C:\Users\NH4NO3nice\AppData\Roaming\Typora\typora-user-images\image-20220816111621330.png)]

4. 模板和静态文件

  • 模板(HTML文件)一般存放在app目录下的templates文件夹下;

  • 静态文件一般存放在app目录下的static文件夹下;

    • 图片;
    • css样式;
    • JavaScript文件;
    • 插件
    ├─static
    │  ├─css      【存放css样式】
    │  ├─img      【存放图片】
    │  ├─js       【存放JavaScript文件】
    │  └─plugins  【存放插件:Bootstrap(集成的好看的css样式)、font-awesome(多样式图标)】
    ├─templates   【存放HTML模板】
    
  • 注意:在HTML中引用静态文件时,推荐写法:

    {% load static %}  # 先加载static这个目录
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>国奖答辩</title>
    </head>
    <body>
        <img src="{% static 'img/1.jpg' %}">
    </table>
    
    </body>
    </html>
    

5. 模板语法(依赖于Django)

还有模板语法的HTML文件会被Django解释,将占位符替换掉,再发送到浏览器进行显示

5.1 HTML模板中的占位符

在web开发的过程中我们想要从python代码中动态获取变量,并展示在网页中。需要先在HTML模板中将想要动态展示的数据用特殊占位符占位。

<div>{{ n1 }}</div>  # {{}}记为HTML中特殊的占位符,n1为变量名,用于python数据引入
# 将name变量传给index.html,在html中找到名为n1的特殊占位符,完成数据传递
def index(request):
    temp = '主页'
	return render(request, 'index.html', {'n1':temp})  # 数据传递以字典的格式进行,temp可以是数字、字符串、列表.....

5.2 HTML模板中的列表索引

如果在python与HTML数据传递时,传入了一个字符串,希望在网页上分开显示列表元素,则在HTML中运用到索引。再HTML索引都是用.,字典索引同样。

def index(request):
    name = ['张三', '李四', '王五']
	return render(request, 'index.html', {'n2':name})
<div>{{ n.0 }}</div>  # 获取第一个元素
<div>{{ n.1 }}</div>  # 获取第二个元素
<div>{{ n.2 }}</div>  # 获取第三个元素

5.3 HTML模板中的循环

相HTML传递一个列表,在页面上可以循环展示

  • 列表循环

    def index(request):
        name = ['张三', '李四', '王五']
    	return render(request, 'index.html', {'n3':name})
    
    <div>
        {% for item in n3 %}
        	<span>{{ item }}</span>
        {% endfor %}
    </div>
    
  • 字典循环

    def index(request):
        name = ['ID':2323, '姓名':'张三', '电话':'12312314']
    	return render(request, 'index.html', {'n3':name})
    
    <div>
        {% for item in n3.keys %}  # 对键进行循环
        	<span>{{ item }}</span>
        {% endfor %}
    </div>
    
    <div>
        {% for item in n3.values %}  # 对值进行循环
        	<span>{{ item }}</span>
        {% endfor %}
    </div>
    
    <div>
        {% for key, value in n3.items %}  # 对键值进行循环
        	<span>{{ key }} = {{value}}</span>
        {% endfor %}
    </div>
    

5.4 HTML模板中的条件语句

def index(request):
    name = '张三'
	return render(request, 'index.html', {'n1':name})
<div>
    {% if n1 == '张三' %}
    	<span>正确</span>
    {% elif n1 == '李四'%}
    	<span>哈哈</span>
    {% else %}
    	<span>错误</span>
    {% endif%}
</div>

6. Django数据库操作

在Django内部提供了orm框架,它承担了”翻译“的工作,将简洁的代码翻译成MySQL可以识别的指令,传给mysqlclient,再发送给MySQL。

6.1 安装第三方模块

# MySQL原版也支持pymysql,但是新版兼容不太好
pip install mysqlclient

6.2 ORM

ORM可以做两件事:

  • 创建、修改、删除数据库的表(不用再写SQL语句),但是不能创建数据库;
  • 操作表中的数据;

6.3 创建数据库

  • 启动MySQL服务;
  • 用自带工具创建数据库;

6.4 Django连接数据库

需要修改Django配置,在setting.py中配置个修改,默认为文件数据库。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4xRx4dU-1660955662343)(C:\Users\NH4NO3nice\AppData\Roaming\Typora\typora-user-images\image-20220817184210030.png)]

将DATABASES修改为刚刚创建的数据库,

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'first_web',  # 数据库的名字
        'USER': 'root',  # MySQL的用户名
        'PASSWORD': '*****',  # MySQL密码
        'HOST': '127.0.0.1',  # 安装了MySQL的电脑的地址
        'POST': 3306,  # 端口号

    }
}

6.5 Django操作表

Models.py文件中进行操作,创建一个类,即创建了一个同名(在类名前面会加上app的名字)的表。ORM会把python类翻译成SQL指令

from django.db import models


# Create your models here.
class UserInfo(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=64)
    age = models.IntegerField()
-- 等效SQL指令
create table app01_UserInfo(
	id bigint auto-increment primary key,  -- 自动定义的
    name varchar(32),
    password varchar(64),
    age int
)
  • 表关联

    假如有两张表,一个部门列表(部门名称+id),一个员工列表,在员工列表中有一列所属部门,可以对这一列设置限制,让该列数据只能是部门列表中的部门对应id,即将所属部门这一列与部门列表相关联;

    from django.db import models
    
    class Department(models.Model):
        """部门表"""
        title = modeLs.CharField(verbose_ name= '标题', max_Length=32)
        
        
    class UserInfo(models.Model): 
        """员工表"""
        name = modeLs.CharField(verbose_name="姓名", max_Length=16)
        password = modeLs.CharField(verbose_name="密码", max_Length=64) 
        age = models.IntegerField(verbose_name="年龄")
        account = models.DecimalField(verbose_name="账户余额", max_ digits=10, decimal pLaces=2, default=0)
        create time = models.DateTimeField(verbose_name="入职时间")
        
        ###### 对于所属部门列的设置 ######
        #无约束时,问题在于:输入的id可能不在部门表当中,造成无法与部门相对应
        depart_id = models.BigIntegerField(verbose_name="部门ID")
        # 有约束,Django提供了表单关联的命令,ForeignKey
        depart = models.ForeignKey(to="Department", to_field="id")
        # 其中
        #	- to,与哪张表关联
        #	- to_ field, 与表中的哪一列关联
        # 输入这个命令之后django自动在depart后面加上_id
        #	-生成数据列depart_id 
        
        
        # 直接像上面那样写,不能被执行,因为如果部门表被删除,depart_id列会受到影响:
        # 1.级联删除
        # depart = models.ForeignKey(to="Department", to_field="id", on_deLete=models.CASCADE)
        # 2.置空
        # depart = modeLs.ForeignKey(to="Department", to_fieLd="id", null=True, blank=True, on_deLete=models.SET_NULL)
    
    
  • 限制表中列储存的数据

    class UserInfo(models.Model): 
          gender_choices = (
          	(1, '男'),
              (2, '女'),
          )
          ##### choices限制性别列只能储存1或2,分别对应‘男’‘女’,verbose_name仅仅是一个标记,便于自己看
          gender = models.smallIntegerField(verbose_name="性别", choices=gender_choices)
    
  • 创建表

    打开pycharm终端,执行下面两条指令,即可根据Module.py终端类创建数据表

    >>> python manage.py makemigrations
    >>> python manage.py migrate
    
    mysql> show tables;
    +----------------------------+
    | Tables_in_first_web        |
    +----------------------------+
    | app01_userinfo             |
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    | tb1                        |
    +----------------------------+
    12 rows in set (0.00 sec)
    
  • 如果想要再添加表,则在Model.py中添加类,再运行上面两条指令;

  • 如果不想要某个表,则在Model.py中删除该类,再运行上面两条指令;

  • 如果想在某个表中在删除一列,则在Model.py的对应类中删除对应代码,再运行上面两条指令;

  • 但如果想要在某个表中添加一列,则会出现问题,需要在对应类中定义该列时设置默认值或者运行为空,才能创建,因为原表格中可能已有数据;

    age = models.IntegerField(default=0)
    age = models.IntegerField(null=True, blank=True)
    

6.6 Django操作表中数据

不在Model.py文件中进行操作,类只是对表结构进行操作)

  • 新建数据

    想要测试添加数据的操作,需要在views.py中创建视图函数(主要要在urls.py中进行配置),进行访问;

    from django.shortcuts import render, HttpResponse
    from app01.Models import UserInfo  # 导入Model中的对应类
    
    def orm(resquest):
        # 向数据表中添加一行数据
        # 1.找到表格对应的类名,类名.objects获取表格,.create添加数据
        UserInfo.objects.create(name='张三', password='1234', age=23)
    
        return HttpResponse('操作成果')
    
    mysql> select * from app01_userinfo;
    +----+------+----------+-----+
    | id | name | password | age |
    +----+------+----------+-----+
    |  1 | 张三 | 1234     |  23 |
    +----+------+----------+-----+
    1 row in set (0.00 sec)
    
  • 删除数据

    from django.shortcuts import render, HttpResponse
    from app01.Models import UserInfo  # 导入Model中的对应类
    
    def orm(resquest):
        # 删除数据,先筛选在删除
        UserInfo.objects.filter('id=1').delete()  # filter(筛选条件)
        UserInfo.objects.all().delete()  # 删除所有数据
    
        return HttpResponse('操作成果')
    
  • 修改数据

    from django.shortcuts import render, HttpResponse
    from app01.Models import UserInfo  # 导入Model中的对应类
    
    def orm(resquest):
        # 修改数据,先筛选在修改
        UserInfo.objects.filter('id=1').update('age'=10)  # filter(筛选条件),update(列=值)
        UserInfo.objects.all().update('password'='452')  # 将所有数据中的password列修改为‘452’
    
        return HttpResponse('操作成果')
    
  • 获取数据

    from django.shortcuts import render, HttpResponse
    from app01.Models import UserInfo  # 导入Model中的对应类
    
    def orm(resquest):
        # 获取数据
        data_list = UserInfo.objects.all()  # 获取所有数据
        data_list = UserInfo.objects.filter()  # 括号中放筛选条件
        # 获取的data_list为一个列表,每个元素都对应一行数据,计算表中只有一行数据,也是含一个元素返回一个列表
        # data_list中的每个元素不是确切的值,而仅是表中某一行的对象,通过这个对象可以获取该行每一列的数据
        for obj in data_list:
            print(obj.id, obj.name, obj.password, obj.age)
    
        return HttpResponse('操作成果')
    

最后推荐一个学习视频,个人觉得很适合初学者,快速上手Django,开发简单的网页。哔哩哔哩网址:https://www.bilibili.com/video/BV1rT4y1v7uQ,感谢@银角大王-武沛齐。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值