Django框架入门

简介: Django框架入门

三大主流框架

(1)Django

(2)Flask

(3)Tornado

Django MVC模式

(1)模型 Model

(2)视图 View

(3)控制器 Controller

准备工作

1、创建项目

django-admin startproject <projectName>

# eg:
django-admin startproject mysite
cd mysite

2、项目介绍

setting.py  # 配置文件

urls.py # 路由配置
manage.py # 管理文件

3、Django基本命令

python manage.py runserver # 运行Django项目
python manage.py shell # shell环境
python manage.py test # 执行测试

4、数据库相关命令

python manage.py makemigrations  # 创建模型变更的迁移文件
python manage.py migrate # 执行上一个命令创建的迁移文件
python manage.py dumpdata # 数据库导出到文件
python manage.py loaddata # 文件导入到数据库

5、Django项目 Vs Django应用

每个应用可以管理自己的模型视图模板路由和静态文件

一个项目可以包含一组配置和若干个Django应用

6、创建应用

(1)新建应用

python manage.py startapp <appName>

# eg:
python manage.py startapp myblog

(2)setting.py 中注册app

INSTALLED_APPS = [
# ...

'myblog.apps.MyblogConfig' # 这是新建的app
]

(3)新建视图函数

myblog/views.py

from django.http import HttpResponse


def hello(request):
return HttpResponse("hello Django")

(4)app中配置url

新建 myblog/urls.py 将url与视图做映射关系


from django.urls import path
from . import views


urlpatterns = [
path('hello', views.hello),
]

(5)项目中配置url

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
path('admin/', admin.site.urls),
path('myblog/', include("myblog.urls")),
]

访问测试 http://127.0.0.1:8000/myblog/hello

7、应用目录

views.py   # 视图处理
models.py # 应用模型
admin.py # Admin模块管理对象
apps.py # 声明应用
tests.py # 编写应用测试用例
urls.py # 管理应用路由(自行创建)

Django模型层

视图层 <-> 模型层 <-> 数据库

1、模型层

(1)屏蔽不同数据库之间的差异

(2)便捷工据

2、settings.py 配置数据库引擎

DATABASES  # 选项配置数据库 默认为sqlite3

3、模型字段类型

(1)数字类型:IntegerField

(2)文本类型:TextField

(3)日期类型:DataTimeField

(4)自增ID: AutoField

(5)主键: primary_key

myblog/models.py 新建文章model

from django.db import models


class Article(models.Model):
# 文章的唯一ID
article_id = models.AutoField(primary_key=True)
# 文章标题
title = models.TextField()
# 文章摘要
brief_content = models.TextField()
# 文章内容
content = models.TextField()
# 文章发布日期
publish_date = models.DateTimeField(auto_now=True)

执行数据库建表操作

$ python manage.py makemigrations  # 生成建表操作

$ python manage.py migrate # 执行操作

4、Django Shell

交互式编程

小范围测试

进入shell

python manage.py shell

from myblog.models import Article

# 新建文章
a = Article()
a.title = "文章标题"
a.brief_content = "文章摘要"
a.content = "文章内容"

print(a)

a.save()

# 查询文章
articles = Article.objects.all()
article = articles[0]
print(article.title)

5、Django Admin

后台管理工具

用户认证,显示管理表格,校验输入等相似功能

创建管理员用户

python manage.py createsuperuser

后台管理地址

http://127.0.0.1:8000/admin

将模型注册到admin模块

myblog/admin.py

from django.contrib import admin

# Register your models here.
from .models import Article

admin.site.register(Article)

修改后台显示

myblog/models.py

class Article(models.Model):
# ...

# 修改admin后台显示 Article object -> self.title
def __str__(self):
return self.title

6、数据返回

编写视图函数

myblog/views.py


from django.http import HttpResponse, JsonResponse
from .models import Article

def articles(request):
# 查询数据 select * from article
lst = Article.objects.values().all()
return JsonResponse(list(lst), safe=False)

配置app路由

myblog/urls.py

from django.urls import path
from . import views


urlpatterns = [
path('hello', views.hello),
# 新增路由映射
path('articles', views.articles),
]

测试返回

http://127.0.0.1:8000/myblog/articles

[
{
"article_id": 1,
"title": "文章标题",
"brief_content": "文章摘要",
"content": "文章内容",
"publish_date": "2019-09-14T14:36:32.400Z"
},
{
"article_id": 2,
"title": "这个事第二篇文章",
"brief_content": "这个事第二篇文章的内容摘要",
"content": "这个事第二篇文章的内容",
"publish_date": "2019-09-14T14:36:51.387Z"
}
]

Django视图与模板

Bootstrap栅格系统,宽为12等份

https://www.bootcss.com/

1、模板系统

表现形式是文本

分离文档的表现形式和表现内容

定义了特有的标签占位符

2、基本语法

(1)变量

{
        {name}}

(2)for循环

{% for item in list %} 
<li>{ {item}}</li>
{% endfor %}

(3)if-else分支

{% if true %} 
<p>true</p>
{% else %}
<p>false</p>
{% endif %}

3、渲染页面

myblog/views.py

from django.shortcuts import render
from .models import Article

def index_page(request):
lst = Article.objects.all()

data = {
"article_list": lst
}
return render(request, "myblog/index.html", data)

myblog/templates/myblog/index.html

{% for article in article_list %}
<div class="page-body-main">
<h2>{ { article.title }}</h2>
<p>{ { article.content }}</p>
</div>

{% endfor %}

4、路由参数

myblog/urls.py

from django.urls import path
from . import views

# 添加命名空间
app_name = "myblog"

urlpatterns = [
#...

path('detail/<int:article_id>', views.detail_page, name="detail"),
]

传递路由参数

myblog/templates/myblog/index.html

<!-- 硬编码 -->
<a href="/myblog/detail/{ {article.article_id}}">{ { article.title }}

<!-- 或者使用name -->
<a href="{% url 'myblog:detail' article.article_id %}">{ { article.title }}

5、查询SQL日志

setting.py

# 查看sql日志
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level': 'DEBUG',
},
}
}

6、Paginator分页

视图函数 myblog/views.py


def index_page(request):
page = request.GET.get("page", "1")
page = int(page)

# 并没有直接查询所有数据
lst = Article.objects.all()

# 分页,每页5个
paginator = Paginator(lst, 5)
current_article_list = paginator.get_page(page)

# 上一页下一页
if current_article_list.has_next():
next_page = current_article_list.next_page_number()
else:
next_page = page

if current_article_list.has_previous():
previous_page = current_article_list.previous_page_number()
else:
previous_page = page

data = {
"article_list": current_article_list,
"page_range": paginator.page_range,
"current_page": page,
"previous_page": previous_page,
"next_page": next_page,

}
return render(request, "myblog/index.html", data)

模板渲染分页部分(使用Bootstrap样式)

myblog/templates/myblog/index.html

 <ul class="pagination">
<li>
<a href="{% url 'myblog:index' %}?page={ { previous_page }}" aria-label="Previous">
<span aria-hidden="true">&laquo;</span>
</a>
</li>

{% for page in page_range %}
<li><a href="{% url 'myblog:index' %}?page={ { page }}">{ { page }}</a></li>
{% endfor %}

<li>
<a href="{% url 'myblog:index' %}?page={ { next_page }}" aria-label="Next">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
</ul>


            </div>
目录
相关文章
|
机器学习/深度学习 人工智能 算法
人工智能在医疗诊断中的应用与前景
本文探讨了人工智能(AI)技术在医疗诊断领域的应用现状及其未来发展前景。通过分析AI技术如何辅助医生进行疾病诊断、提高诊断准确性和效率,以及面临的挑战和伦理问题,本文旨在为读者提供一个关于AI在医疗领域应用的全面视角。
|
机器学习/深度学习 人工智能 搜索推荐
人工智能在医疗诊断中的应用与挑战
【10月更文挑战第28天】 本文深入探讨了人工智能(AI)在医疗诊断领域的应用现状、面临的挑战以及未来的发展趋势。通过分析AI技术如何提高诊断效率和准确性,同时指出数据隐私、伦理问题和技术局限性等关键挑战,本文旨在为医疗行业和AI研究者提供有价值的参考。
358 0
|
安全 物联网 网络安全
智能家居安全:物联网设备的风险与防护措施
随着物联网技术的飞速发展,智能家居已成为现代生活的一部分。然而,智能设备的便利性背后隐藏着安全隐患。本文将深入探讨物联网设备面临的主要风险,并提供有效的防护措施,帮助用户构建一个更安全的智能家居环境。
493 7
|
数据安全/隐私保护
MIUI中无法获取所有短信的坑
MIUI中无法获取所有短信的坑
391 2
|
语音技术 iOS开发 MacOS
Mac上的全局翻译利器 : Bob + PopClip
Mac上的全局翻译利器 : Bob + PopClip
1284 0
|
数据挖掘 计算机视觉 Python
SciPy图像处理技巧:图像增强与特征提取
【4月更文挑战第17天】本文介绍了如何使用SciPy进行图像增强和特征提取。通过调整亮度、对比度和伽马校正实现图像增强,示例代码展示了相关操作。同时,利用Sobel算子进行边缘检测和Laplacian of Gaussian (LoG) 进行角点检测,以提取图像特征。虽然SciPy不是专业的图像处理库,但其数值计算能力在图像分析中仍有一定价值,可与其他图像处理库结合使用。
|
算法 定位技术
探寻最短路径之谜:Dijkstra算法详解
探寻最短路径之谜:Dijkstra算法详解
|
人工智能 物联网 vr&ar
未来智能家居技术的发展趋势与应用前景
随着科技的不断进步,智能家居技术正以惊人的速度改变着我们的生活方式。本文将探讨未来智能家居技术的发展趋势,以及其在日常生活中的应用前景,为读者带来对未来生活的一瞥。
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
SQL 分布式计算 大数据
BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略
BigData:大数据开发的简介、核心知识(linux基础+Java/Python编程语言+Hadoop{HDFS、HBase、Hive}+Docker)、经典场景应用之详细攻略