Django 入门教程|Web开发|用户管理实战

4658de6d08394497b5954f3732aa3cea.png

简介

Django是一个主流的Python Web框架,用于快速开发 Web 应用程序。功能强大,Python Web应用开发的第一选择。

特点

  • ORM(对象关系映射): Django 提供了一个强大的 ORM,允许开发者通过 Python 代码来定义和操作数据库模型,而无需直接使用 SQL。这使得数据库操作更加抽象和易于管理。

  • MVC 架构: Django 遵循 MVC(模型-视图-控制器)的软件设计模式,但它使用了稍微不同的术语。在 Django 中,模型(Model)表示数据结构,视图(View)负责呈现用户界面,而控制器(Controller)的职责被称为视图(View)。

  • 模板引擎: Django 使用模板引擎来生成 HTML,这使得前端和后端的代码分离更加容易。Django 的模板语言允许开发者在模板中嵌入动态内容。

  • 自动化 admin 界面: Django 自动生成管理后台,使得管理和操作数据库的过程变得非常简单。开发者可以轻松地创建、修改和删除数据库记录,而无需编写自定义的管理界面。

  • 表单处理: Django 提供了强大的表单处理工具,使得用户输入的验证和处理变得更加简单。这对于开发 Web 表单和处理用户提交的数据非常有用。

  • 安全性: Django 内置了一些安全性功能,例如防止常见的 Web 攻击(如 CSRF 攻击),并提供了方便的用户身份验证和授权系统。

  • 可扩展性: Django 的组件是松耦合的,允许开发者使用现有的组件或编写自己的应用程序来扩展框架功能。

  • 社区支持: Django 拥有庞大的社区支持,提供了大量的文档、教程和第三方包,使得学习和使用 Django 变得更加容易。

MVC 与 MTV模型

MVC 模型

MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。

MVC 以一种插件式的、松耦合的方式连接在一起。

  • 模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
  • 视图(V)- 图形界面,负责与用户的交互(页面)。
  • 控制器(C)- 负责转发请求,对请求进行处理。

简易图:

7d560a9c2b6473aa79e8a5fc0d8ae35a.png

用户操作流程图:

63bdeae6fa8ef54d4a8c706a5fdfff7b.png


MTV 模型

Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:

  • M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
  • T 表示模板 (Template):负责如何把页面(html)展示给用户。
  • V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template。

除了以上三层之外,还需要一个 URL 分发器,它的作用是将一个个 URL 的页面请求分发给不同的 View 处理,View 再调用相应的 Model 和 Template,MTV 的响应模式如下所示:

简易图:

7a3d8bc38e9fcd4c353c2cfa979b2e99.png

用户操作流程图:

675b3eb0b78eea9d329d5ebc834307c6.png

解析:

用户通过浏览器向我们的服务器发起一个请求(request),这个请求会去访问视图函数:

  • a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
  • b.如果涉及到数据调用,那么视图函数调用模型,模型去数据库查找数据,然后逐级返回。

视图函数把返回的数据填充到模板中空格,最后返回网页给用户。

安装Django

本教程使用的是Python3.11,Django5.0。

使用Django需要安装Python环境,如果你还没有安装 Python,请先从 Python 官网Download Python | Python.org下载并安装最新版本的 Python。

如果你还不懂Python,去这里学习Python基础:Python从入门到精通

安装django非常容易,一行代码搞定:

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

验证一下是否安装成功,看到版本号表示ok:

python -m django --version

好的,我们已经安装好了Django,接下来我们正式进行Django开发。

创建一个Django项目

django-admin startproject mysite

执行后会生成如下项目结构

mysite
|-- mysite
|   |-- __init__.py
|   |-- asgi.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- manage.py
  • mysite: 项目的容器。
  • manage.py: 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互。
  • mysite/__init__.py: 一个空文件,告诉 Python 该目录是一个 Python 包。
  • mysite/asgi.py: 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目。
  • mysite/settings.py: 该 Django 项目的设置/配置。
  • mysite/urls.py: 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"。
  • mysite/wsgi.py: 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目。

接着我们进入 mysite 目录输入以下命令,启动服务器:

python manage.py runserver

注意:默认端口为8000,你也可以指定你的ip和端口,例如:python manage.py runserver ip port

好了现在你已经启动了django项目,在浏览器访问 127.0.0.1:8000 就会看到django的默认页面。

接下来我们开发一个用户管理案例,结合MySQL+Bootstrap+jQuery完成用户的增删改查。

django5.0需要安装MySQL8.0+,请确保你已经安装了MySQL8.0+

用户管理案例

基于mysite项目创建app

1.创建应用程序

python manage.py startapp ums

模板文件和静态文件进行分开管理,便于维护。按照如下创建:

bce840905fe84fe395ca71358f46a400.png

确保你的目录命名一定是templates和static,否则django容器加载不到。

2.数据库配置

mysite/settings.py文件中配置你的MySQL连接信息

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'ums','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': '123456',}
}

3.下载mysqlclient

mysqlclient作为django与MySQL的桥梁,负责数据的操作和持久化。通过mysqlclient来初始化表结构。

pip install mysqlclient

4.定义模型

ums/models.py 放入以下内容

class UserInfo(models.Model):username = models.CharField(verbose_name='用户名', max_length=32)password = models.CharField(verbose_name='密码', max_length=64)age = models.IntegerField(verbose_name='年龄')salary = models.DecimalField(verbose_name='工资', max_digits=10, decimal_places=2)gender_choices =((1, '男'),(2, '女'))gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)create_time = models.DateTimeField(verbose_name='创建时间')

数据库表初始化

$ python manage.py makemigrations$ python manage.py migrate

5、编写视图

ums/views.py 编写用户增删改查

def user_list(request):""" 查询用户列表 """# 获取所有用户列表 [obj,obj,obj]queryset = models.UserInfo.objects.all()return render(request, 'user_list.html', {'queryset': queryset})def user_add(request):""" 添加用户 """if request.method == "GET":context = {'gender_choices': models.UserInfo.gender_choices,"dept_list": models.Department.objects.all()}return render(request, 'user_add.html', context)# 获取用户提交的数据user = request.POST.get('username')pwd = request.POST.get('pwd')age = request.POST.get('age')salary = request.POST.get('salary')ctime = request.POST.get('ctime')gender = request.POST.get('gd')dept = request.POST.get('dp')# 添加到数据库中models.UserInfo.objects.create(username=user, password=pwd, age=age,salary=salary, create_time=ctime,gender=gender, dept_id=dept)# 返回到用户列表页面return redirect("/user/list/")def user_delete(request, nid):""" 删除用户 """models.UserInfo.objects.filter(id=nid).delete()return redirect('/user/list/')def user_edit(request, nid):""" 编辑用户 """row_object = models.UserInfo.objects.filter(id=nid).first()if request.method == "GET":# 根据ID去数据库获取要编辑的那一行数据(对象)form = UserModelForm(instance=row_object)return render(request, 'user_edit.html', {'form': form})form = UserModelForm(data=request.POST, instance=row_object)if form.is_valid():# 默认保存的是用户输入的所有数据,如果想要再用户输入以外增加一点值# form.instance.字段名 = 值form.save()return redirect('/user/list/')return render(request, 'user_edit.html', {"form": form})from django import formsclass UserModelForm(forms.ModelForm):username = forms.CharField(min_length=3, label="用户名")class Meta:model = models.UserInfofields = ["username", "password", "age", 'salary', 'create_time', "gender", "dept"]def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环找到所有的插件,添加了class="form-control"for name, field in self.fields.items():field.widget.attrs = {"class": "form-control", "placeholder": field.label}

6、编写模板

templates下编写模板

user_list.html

{% extends 'layout.html' %}{% block content %}<div class="container"><div style="margin-bottom: 10px"><a class="btn btn-success" href="/user/add/"><span class="glyphicon glyphicon-plus-sign" aria-hidden="true"></span>新建用户</a></div><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>用户列表</div><!-- Table --><table class="table table-bordered"><thead><tr><th>ID</th><th>用户名</th><th>密码</th><th>年龄</th><th>工资</th><th>创建时间</th><th>性别</th><th>所属部门</th><th>操作</th></tr></thead><tbody>{% for obj in queryset %}<tr><th>{{ obj.id }}</th><td>{{ obj.name }}</td><td>{{ obj.password }}</td><td>{{ obj.age }}</td><td>{{ obj.salary}}</td><td>{{ obj.create_time|date:"Y-m-d" }}</td><td>{{ obj.get_gender_display }}</td><td>{{ obj.dept.name}}</td><td><a class="btn btn-primary btn-xs" href="/user/{{ obj.id }}/edit/">编辑</a><a class="btn btn-danger btn-xs" href="/user/{{ obj.id }}/delete/">删除</a></td></tr>{% endfor %}</tbody></table></div></div>
{% endblock %}

user_add.html 

{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title"> 新建用户 </h3></div><div class="panel-body"><form method="post">{% csrf_token %}<div class="form-group"><label>用户名</label><input type="text" class="form-control" placeholder="姓名" name="username" /></div><div class="form-group"><label>密码</label><input type="text" class="form-control" placeholder="密码" name="pwd"/></div><div class="form-group"><label>年龄</label><input type="text" class="form-control" placeholder="年龄" name="age"/></div><div class="form-group"><label>余额</label><input type="text" class="form-control" placeholder="工资" name="salary"/></div><div class="form-group"><label>创建时间</label><input type="text" class="form-control" placeholder="创建时间" name="ctime"/></div><div class="form-group"><label>性别</label><select class="form-control" name="gd">{% for item in gender_choices %}<option value="{{ item.0 }}">{{ item.1 }}</option>{% endfor %}</select></div><div class="form-group"><label>部门</label><select class="form-control" name="dp">{% for item in dept_list %}<option value="{{ item.id }}">{{ item.name}}</option>{% endfor %}</select></div><button type="submit" class="btn btn-primary">提 交</button></form></div></div></div>
{% endblock %}

user_edit.html

{% extends 'layout.html' %}{% block content %}<div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title"> 编辑用户 </h3></div><div class="panel-body"><form method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red;">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提 交</button></form></div></div></div>
{% endblock %}

layout.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"><style>.navbar {border-radius: 0;}</style>
</head>
<body>
<nav class="navbar navbar-default"><div class="container"><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse"data-target="#bs-example-navbar-collapse-1" aria-expanded="false"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><a class="navbar-brand" href="#"> 用户管理系统 </a></div><div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"><ul class="nav navbar-nav"><li><a href="/user/list/">用户管理</a></li><li><a href="#">Link</a></li></ul><ul class="nav navbar-nav navbar-right"><li><a href="#">登录</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">Johnny<span class="caret"></span></a><ul class="dropdown-menu"><li><a href="#">个人资料</a></li><li><a href="#">我的信息</a></li><li role="separator" class="divider"></li><li><a href="#">注销</a></li></ul></li></ul></div></div>
</nav><div>{% block content %}{% endblock %}
</div><script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>

7、配置路由

mysite/urls.py 配置路由

from django.contrib import admin
from django.urls import path
from app01 import viewsurlpatterns = [# 用户管理path('user/list/', views.user_list),path('user/add/', views.user_add),path('user/<int:nid>/edit/', views.user_edit),path('user/<int:nid>/delete/', views.user_delete),
]

最后启动程序,恭喜您,完成!

python manage.py runserver

23c42ef9253b4501a607f6a5158da675.png

如果本文对您有帮助,请持续关注此博客,我会在这里分享更多Python、Java相关优质好文,帮助提升您的技术能力。

如果您有任何疑问或建议,请在评论区留言,有空时我会尽力为您解答。感谢您的阅读和支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作&#xff0c;本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中&#xff0c;在生成的exe中。动态链接库是在程序运行时链接的&#xff0c;可以在程序运行时调用加载库函数的方法来实现&…

linux 系统安全及应用

一、账号安全基本措施 1.系统账号清理 1.将用户设置为无法登录 /sbin/nologin shell——/sbin/nologin却比较特殊&#xff0c;所谓“无法登陆”指的仅是这个用户无法使用bash或其他shell来登陆系统而已&#xff0c;并不是说这个账号就无法使用系统资源。举例来说&#xff0c;…

苹果电脑交互式原型设计软件Axure RP 9 mac特色介绍

Axure RP 9 for Mac是一款交互式原型设计软件&#xff0c;使用axure rp9以最佳的方式展示您的作品&#xff0c;优化现代浏览器并为现代工作流程设计。同时确保您的解决方案正确完整地构建。Axure RP 9 for Mac为您整理笔记&#xff0c;将其分配给UI元素&#xff0c;并合并屏幕注…

YOLO物体检测-系列教程6:YOLOv5源码解析1

计算机视觉 全教程 目录 物体检测 系列教程 总目录 1、基本概述 YOLOv5没有一篇对应的论文&#xff0c;是一个对v4更好的实现v5版本是一个在github更新的基于工程项目的实现基本上和v4没有差异&#xff0c;只不过在整个项目上做出了更好的实现效果主要基于github的文档介绍来…

Visual Studio 2022 AI Code 支持

1.先在 Log In | Codeium Free AI Code Completion & Chat 上注册一个用户 在Visual Stuido 中扩展中搜索 codeium 并安装 安装完成后登录即可。 注意国内可能存在网络问题无法使用这时建议使用代理进行登录。 地址如下&#xff1a; Sign Up | Codeium Free AI Code Co…

Linux下安装JET2

0. 说明&#xff1a; JET2是一个基于Joint Evolutionary Trees的利用序列和结构信息预测蛋白质界面的软件&#xff0c;详情见: http://www.lcqb.upmc.fr/JET2/JET2.html&#xff0c;http://www.lgm.upmc.fr/JET/JET.html 和 https://doi.org/10.1371/journal.pcbi.1004580 本…

多模态推荐系统综述:三、多模态特征增强

三、多模态特征增强 同一对象的不同模态表示具有独特且共同的语义信息。如果能够区分独特特征和共同特征&#xff0c;那么MRS的推荐性能和泛化能力可以得到显着提高。解耦表征学习&#xff08;DRL&#xff09;和对比学习&#xff08;CL&#xff09;被用来进行基于交互的特征增…

第二证券:主力为什么要砸盘?

砸盘就是在股票的某个阶段有许多卖出单&#xff0c;这些许多的卖出单不断的成交使股票价格出现快速下跌。一般是受到主力资金洗盘或者出货所影响形成的。 1、洗盘 个股通过长时间上涨之后&#xff0c;盘中的散户较多&#xff0c;主力为了洗掉盘中的散户&#xff0c;在低位吸筹…

从私有Git仓库的搭建到命令的使用及部署再到分支管理

一、版本控制系统/版本控制器 1. 版本控制系统&#xff1a; git 分布式 —没有中心代码库&#xff0c;所有机器之间的地位同等&#xff08;每台机器上都有相同的代码&#xff09; svn 集中管理的 —有中心代码库&#xff0c;其他都是客户端 2.git与svn介绍 1.git属于分布…

Mac版 Photoshop 2021---PS2021

Adobe Photoshop 2021是一款强大的图像处理软件&#xff0c;它可以帮助用户进行各种图像编辑、修饰和合成工作。这款软件拥有先进的图像处理技术&#xff0c;支持多种图像格式&#xff0c;可以轻松实现各种复杂的图像处理任务。它还提供了丰富的滤镜和工具&#xff0c;使用户可…

全网最全Stable Diffusion原理快速上手,模型结构、关键组件、训练预测方式!!!!

手把手教你入门绘图超强的AI绘画程序&#xff0c;用户只需要输入一段图片的文字描述&#xff0c;即可生成精美的绘画。给大家带来了全新保姆级教程资料包&#xff08;文末可获取&#xff09; 【AIGC】Stable Diffusion的建模思想、训练预测方式快速 在这篇博客中&#xff0c;…

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中&#xff0c;音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎&#xff0c;它们不仅可以在运动时提供音乐的陪伴&#xff0c;还能增加运动时的乐趣和动力。但是&#xff0c;面对市面上众多不同类型的运动耳机&#xff0c;…

哈希-力扣454.四数相加Ⅱ

题目 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;nums1 [1…

数据结构第十一弹---堆

堆 1、堆的概念及结构2、堆的性质3、堆的调整算法3.1、向下调整算法3.2、向上调整算法 4、堆的实现4.1、头文件包含和结构定义4.2、初始化4.3、销毁4.4、插入数据4.5、删除数据 删除堆顶4.6、获取堆顶元素4.7、获取有效数据个数4.8、判断是否为空 5、代码汇总5.1、Heap.h5.2、H…

好用的设备租赁管理软件有哪些?

“我们公司是做设备租赁的&#xff0c;想找一款适合设备租赁的库存管理软件&#xff0c;最好有库存管理&#xff0c;客户信息&#xff0c;设备外调管理&#xff0c;租赁天数管理&#xff0c;设备的借出与归还信息管理与查询。” 总结一下—— 库存管理客户信息管理设备租赁管…

阿里云服务器 使用Certbot申请免费 HTTPS 证书及自动续期

前言 Certbot是一款免费且开源的自动化安全证书管理工具&#xff0c;由电子前沿基金会&#xff08;EFF&#xff09;开发和维护&#xff0c;是在Linux、Apache和Nginx服务器上配置和管理SSL/TLS证书的一种机制。Certbot可以自动完成域名的认证并安装证书。 一、 安装软件 1.1…

38.深入MySQL

深入MySQL 索引 索引是关系型数据库中用来提升查询性能最为重要的手段。关系型数据库中的索引就像一本书的目录&#xff0c;我们可以想象一下&#xff0c;如果要从一本书中找出某个知识点&#xff0c;但是这本书没有目录&#xff0c;这将是意见多么可怕的事情&#xff01;我们…

JVM如何执行synchronized修饰的方法

首先市面上关于synchronized的资料已经很多了&#xff0c;但是大家对于底层的原理实现可能没有什么概念&#xff0c;大多都是死记硬背&#xff0c;所以我想通过实战的方式给大家带来一些不一样的体验。具体体现在哪些方面呢&#xff1f; 更系统。市面上目前虽然资料众多&#x…

WPF 入门教程DispatcherTimer计时器

https://www.zhihu.com/tardis/bd/art/430630047?source_id1001 在 WinForms 中&#xff0c;有一个名为 Timer 的控件&#xff0c;它可以在给定的时间间隔内重复执行一个操作。WPF 也有这种可能性&#xff0c;但我们有DispatcherTimer控件&#xff0c;而不是不可见的控件。它几…

15-链表-环形链表 II

这是链表的第15题&#xff0c;力扣链接。 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链…