Django入门与实践 学习笔记

一个基于Python的高级Web开发框架
浏览器浏览网页端基本原理
本质是网络通信
获取源代码文档(html)
解析文档后以适当形式展现给用户
F12开发者页面

第一章 环境搭建
Django官方地址:http://www.djangoproject.com
pip install Django==3.0.5
查看Django安装版本 python –m django –version
也可以下载源码进行安装
二、 创建项目,并了解项目目录下部分文件端作用
创建项目
创建步骤:
打开命令行,进入想要安置项的目录,输入cmd
命令行输入:django–admin startproject myblog

当前目录生成myblog文件夹

进入Pycharm,打开myblog文件夹
Manage.py
与项目进行交互的命令行工具集入口
执行python manage.py来查看所有命令

启动服务

Python manage.py runserver

打开浏览器查看
127.0.0.1:8000
Localhost:8000

改变端口

Python manage.py runserver 9999

项目Myblog目录
项目的一个容器
包含项目最基本的一些配置
目录名称不建议修改

Wsgi.py
Python web server gateway interface
中文名:pyhton服务器网关接口
Python应用于web服务器之间的接口

Urls.py
URL配置文件
Django项目中所有地址(页面)都需要我们自己去配置其URL

Settings.py
项目的总配置文件,包含数据库、web应用,时间等各种配置
BASE_DIR
项目根目录

# SECURITY WARNING: don't run with debug turned on in production!不要在实际生产中打开(True)

DEBUG = True
1
2
网站bug如果打开debug模式直接错误抛给前端用户
如果关闭,且allowed_hosts有url,通过url访问,前端不显示具体错误,就写找不到

ALLOWED_HOSTS
ALLOWED_HOSTS = [‘localhost’]
ALLOWED_HOSTS默认为空,
如果写入’localhost’,就只允许通过localhost访问,ip不行
如果是127.0.0.1:9999,直接抛出404错误,被屏蔽

INSTALL_APPS应用列表,新增的应用要加入

MIDDLEWARE中间件

ROOT_URLCONF URL根文件

TEMPLATES模板

WSGI_APPLICATION不管
DATABASES数据库配置 默认使用sqlite3

Internationalization国际化
语言时区
Static_url静态文件地址

init_.py 声明模块,有了就可以improt
Debug

三、创建应用
打开cmd,进入项目中manage.py同级目录
输入:

pyhton manage.py statrtapp blog

添加应用名blog到settings.py中的INSTALLED_APPS里
注意:应用名不能与默认模块名相同,如os,math,myblog

应用目录介绍
Migrations
数据移植(迁移)模块,涉及到数据库操作
内容自动生成

Admin.py
该应用的后台管理系统配置,每个应用都有

Apps.py
当前应用的一些配置,django-1.9以后才生成

Models.py
数据模块
使用ORM框架

Test.py
自动化测试模块,提供自动化测试功能

Views.py
执行响应代码所在
代码逻辑处理的主要地点
项目中大部分代码都在这里

四、创建第一个页面(响应)
blog/Views.py添加响应函数

from django.http import HttpResponse
def index(request):
	return HttpResponse('hello world')

URLs.py中增加路径

import blog.views as bv
path(rc', bv.index)

浏览器中输入http://127.0.0.1:9999/index/
可以看到调用index函数结果

总结:
1、创建应用
2、编辑blog.views
3、每个响应对应一个函数,函数必须返回一个响应
4、函数必须存在一个参数,一般约定为request
5、每一个响应函数对应一个URL
6、配置URLS.PY
每个URL都以url的形式写出来
url函数放在urlpatterns列表中
url函数三个参数:URL(正则),对应方法,名称

第五章 第一个Template
5-1 配置URL
假如网站太大,直接写在URL文件里难以维护

第二种URL配置
Include方法
在blog页面(响应)下新建urls.py

from . import views as bv
urlpatterns = [
    path('admin/', admin.site.urls),
    path(r'index/', bv.index),
    ]

打开根目录下myblog/urls.py,引用include方法

from django.urls import path, include

修改myblog/urls.py中路径为:

path(r'index/', include('blog.urls')),

启动server
浏览器中输入http://127.0.0.1:9999/index/index/可以访问
第一个index是myblog/urls.py里配置的,第二个index是blog/urls.py里配置的
修改myblog/urls.py中路径为:

path(r'blog/', include('blog.urls')) ,  # 修改为blog与实际响应文件路径一致

修改blog/urls.py中路径为:

path(r'', include('blog.urls')) ,	# 修改为空3.0.5版本这样就可以了

浏览器中输入http://127.0.0.1:9999/blog/
问题:blog/urls.py中路径设置为空,用所有字符串,都可以访问(3.0.5版本中没有这个问题)
浏览器中输入http://127.0.0.1:9999/blog/afiodjfklaj
修改blog/urls.py中路径为:
path(r’^KaTeX parse error: Expected 'EOF', got '#' at position 28: …blog.urls')) , #̲ 用正则表达式限定空字符串(3…访问

修改blog/urls.py中路径为:
path(r’^index/KaTeX parse error: Expected 'EOF', got '#' at position 28: …blog.urls')) , #̲ 注意要有/ 浏览器中输入ht…才能访问,可能是对正则表达式做了什么限制,以后研究

总结:
在根urls.py 中引入include
在APP目录下创建urls.py文件,格式与根urls.py相同
根urls.py中url函数第二个参数改为include(‘blog.urls’)

注意事项:
根urls.py针对APP配置的URL名称,是该APP所有url的总路径
配置URL时候注意正则表达式结尾符号$和/(3.0.5版本中没有该问题)

5-2 开发第一个Template(模板)
什么是Template
就是HTML文件
使用了django模板语言(django template language,DTL)
可以使用第三方模板(如Jinja2)
Settings.py中,TEMPLATES静态变量
‘BACKEND’修改模板引擎,课程使用默认DTL

步骤:
在APP的根目录(blog)下,创建templates目录
在templates目录下创建html文件
Render用来传递数据到浏览器
在views.py中返回render
from django.shortcuts import render # (渲染)
return render(request, ‘index.html’)
浏览器中输入http://127.0.0.1:9999/blog/

DTL初步使用
Render()函数中支持一个dict类型参数
该字典是后台传递到模板的参数,key为参数名
在模板中使用{{参数名}}来使用

Views.py中
return render(request, ‘index.html’, {‘hello’: ‘hello,blog!’})
index.html中

{{hello}}

浏览器中输入http://127.0.0.1:9999/blog/

新建blog2应用
Cmd中 python manage.py startapp blog2
Settings.py中
INSTALLED_APPS添加blog2
把blog中templates文件夹、urls.py复制到blog2
Blog2/templates中index.html中改为hello blog2
Blog里的views.py中的return(去掉render里第三个参数)复制到blog2
def index(request):
return render(request, ‘index.html’)
根myblog目录中urls添加blog2应用路径
path(r’blog2/’, include(‘blog2.urls’)),

启动服务python manage.py runserver(默认8000端口)
浏览器中输入http://127.0.0.1:9999/blog/,正常显示
浏览器中输入http://127.0.0.1:9999/blog2/,旧版仍显示blog内容,新版(3.0.5)显示空白页面

原因
Django查找Template
Django按照INSTALLED_APPS中的添加顺序查找Templates
不同APP下Templates目录中同名的.html文件会造成冲突,不能一个个改

解决Templates冲突方案
在APP的Templates目录下创建以APP名为名称的目录
将html文件放入新创建的目录下
Blog/views.py修改,增加blog文件夹
return render(request, ‘blog/index.html’, {‘hello’: ‘hello,blog!’})
Blog2/views.py修改,增加blog2文件夹
return render(request, ‘blog2/index.html’, {‘hello’: ‘hello,blog!’})

第六章 Models
6-1 Models
Django中的Models是什么
通常,一个models对应数据库中的一张数据表
Django中models以类的形式表现

ORM 对象关系映射(Object relation mapping)
实现了对象和数据库之间的映射
隐藏了数据访问的细节,不需要编写SQL语句

编写Models
步骤:
在应用根目录(blog)下创建models.py,
并引入models模块(新建应用时候就自动创建好了)
创建类,继承models.Model ,该类就是一张数据表
https://docs.jangoproject.com/en/1.10/ref/models/fields/

在类中创建字段
字段就是类里面的属性(变量)
Attr = models.CharField(max_length=64)

Blog/model.py里创建类(数据库)

class Article(models.Model):
    title = models.CharField(max_length=32, default='Title')
    content = models.TextField(null=True)

模型创建后如何映射成数据表
步骤
Cmd进入manage.py同级目录
执行 python manage.py makemigrations app名称(可选)(该命令为准备)
制作数据迁移,不选名称,默认该项目下所有应用都生成数据迁移
再执行 python manage.py migrate(正式迁移)
迁移的内容很多。包括:
Settings.py 里INSTALL_APPS里django自带应用的数据

查看
Django会自动在app/migrations/目录下生成移植文件
打开0001_initial.py
看到多了一个‘Id’字段,是django自动创建的主键

执行python manage.py sqlmigrate 应用名(blog) 文件id(0001)查看SQL语句

python manage.py sqlmigrate blog 0001

数据库在哪里
默认sqlite3的数据库在项目根目录下db.sqlite3
查看并编辑db.sqlite3
推荐轻量级端第三方软件SQLite Expert Personal

页面呈现数据
后台步骤:
Views.py中

import models
Article = models.Article.objects.get(pk=1) # pk:primary key(id),相当于select id =1
Render(request,page,{‘article’: article})

前端步骤:
模板可直接使用对象及对象的‘.’操作
{{article.title}}
Blog文件夹打开index.html

<h1>{{article.title}}</h1>
<h3>{{article.content}}</h3>

第七章 admin
什么是Admin,Django自带的自动化数据管理界面
被授权的用户可以直接在Admin中管理数据库

配置Admin
Settings.py中INSTALL_APPS第一个应用就是admin
只需要创建超级用户
Cmd 输入python manage.py createsuperuser
输入用户名,email,密码(至少8位)

Admin入口 localhost:8000/admin/(记得先打开服务器)
项目根目录中urls默认设置 的admin访问路径
path(‘admin/’, admin.site.urls),

界面语言修改:
Settings.py中Language_CODE = ‘zh-hans’ # zh_Hans会报错,zh-hans简体,zh-hant繁体

配置应用
在应用下admin.py中引入自身的models模块(或里面的模块类)
编辑admin.py
from blog.models import Article
admin.site.register(Article)

浏览器输入http://127.0.0.1:8000/admin/

进入article

增加article,重名都显示类对象的名称
修改模型类打印的字段

修改步骤
在article类下添加一个方法
根据python选择__str__(self) 或 _unicode(self)

def __str__(self):
    return self.title

第八章 完善博客
8-1 博客主页面开发
博客页面设计
页面概要
主页、内容页、撰写页

主页内容:
文章标题列表,超链接
发表博客按钮(超链接)

列表编写思路
取出数据库中所有文章对象
将文章对象们打包成列表,传递到前端
前端页面吧文章以标题超链接的形式逐个列出

模板for循环
{% for xx in xxs %}
Html语句
{% end for %}
注意:之前在模板中调用对象,用{{数据}}
循环是用{% %}

后台修改:
Views.py
articles = models.Article.objects.all() # 获取所有对象
return render(request, ‘blog/index.html’, {‘articles’: articles})

前端页面:
Index.html

<h1>
    <a href="">新文章</a>
</h1>
{% for article in articles %}
    <a href="">{{article.title}}</a>
    <br>
{% end for %}

8-2 博客文章页面开发
页面内容
标题
文章内容
修改文章按钮(超链接)

Views中创建响应函数

def article_page(request, article_id):
    article = models.Article.object.get(pk=article_id)
    return render(request, 'blog/article_page.html', {'article': article})

templates前端增加页面
article_page.html

<h1>{{article.title}}</h1>
<br/>
<h3>{{article.content}}</h3>
<br/><br/>
<a href="">修改文章</a>

url配置环节
响应函数多了一个参数,要在url里体现出来

path(r’article/(?P<article_id>)[0-9]+’, bv.article_page),
正则表达式匹配到的数字以article_id作为组名去匹配,必须与响应函数里的参数名一致
Django3.0.0版本中,要用re_path

from django.urls import path, include, re_path

urlpatterns = [
    re_path(r'^article/(?P<article_id>[0-9]+)$', article_page)]

注意:1、Django3.0.5版本中,要用re_path
2、正则表达式写法
3、引用对象objects

8-3 django模板中的超链接配置
超链接目标地址
Herf后面是目标地址
Template中可以用{% url ‘app_name:url_name’ param%}
其中app_name和url_name都在url中配置

再配URL
url函数的名称参数
根urls,写在include(),的第二个参数位置,namespace = ‘blog’
应用urls,写在url()的第三个参数位置,’name = ‘article’
主要取决于是否使用include引用另一个URL配置文件
Myblog/urls.py中
path(r’blog/’, include(‘blog.urls’, namespace=‘blog’)),
注意:django3.0.5版本中,include第一个参数是一个二维数组,应写为:
path(r’blog/’, include((‘blog.urls’, ‘blog’), namespace=‘blog’)),

blog/urls.py
re_path(r’^article/(?P<article_id>[0-9]+)$’, bv.article_page, name=‘article_page’)
修改blog/templates/blog/article_page.html

8-4 博客撰写页面开发(一)

页面内容
标题编辑栏
文章内容编辑区域
提交按钮

前端编辑
新建edit_page.html文件



后端编辑
注意:包含2个响应函数,页面本身的,和表单form的
Vies.py
def edit_page(request):
return render(request, ‘blog/edit_page.html’)
blog/urls.py添加url
re_path(r’^edit/$’, bv.edit_page)
浏览器输入:http://127.0.0.1:8000/blog/edit/

表单响应函数
使用request.POST[‘参数名’]获取表单数据,post存放前端传过来的数据
放在models中
Models.Article.objects.create(title, content)创建表单对象
Views.py
def edit_action(request):
title = request.POST.get(‘title’, ‘TITLE’)
content = request.POST.get(‘content’, ‘CONTENT’)
models.Article.objects.create(title=title, content=content) # 根据前端回传建立表格
articles = models.Article.objects.all()
return render(request, ‘blog/index.html’, {‘articles’: articles})
blog/urls.py添加url
re_path(r’^edit/ ′ , b v . e d i t p a g e , n a m e = ′ e d i t p a g e ′ ) , r e p a t h ( r ′ e d i t / a c t i o n s / ', bv.edit_page, name='edit_page'), re_path(r'^edit/actions/ ,bv.editpage,name=editpage),repath(redit/actions/’, bv.edit_action, name=‘edit_action’)

CSRF验证失败. 请求被中断.
安全问题,所有通过post方法提交表单,都 必须在前端加
{% csrf_token %} 防止跨站请求伪造,放在标签里

注意,index.html文件中,超链接地址要补充如下,否则首页上所有链接,都默认为新建一个新文章

新文章

{% for article in articles %} {{article.title}}
{% endfor %}

8-5 博客撰写页面开发(二)
修改文章
打开的页面里要有原来的内容,新建文章只要有2个空白框
修改文章页面里有文章对象
有文章的ID
新建文章的ID改成0
Blog/views.py修改edit_page响应,如果id为0,则为新文章,直接返回新建页面
其他返回修改文章页面(还没有添加原文章)
def edit_page(request, article_id):
if str(article_id) == ‘0’:
return render(request, ‘blog/edit_page.html’)
else:
article = models.Article.objects.get(pk=article_id)
return render(request, ‘blog/edit_page.html’, {‘article’: article})

urls.py
re_path(r’^edit/(?P<article_id>[0-9]+)$’, bv.edit_page, name=‘edit_page’), # 修改原有文章,要传入文章id

article_page中,修改文章的链接要改
修改文章

Index.html中,新建文章传id为0
新文章

注意,可能因为缓存问题打不开,关闭页面后重新开

修改文章填入原始文章内容
Edit_page.html
{% if article%} # 条件判断是是否已存在文章






{% else %}






{% endif %}

Edit_action仍然可以通过传递id的方法来做
另一种方法:同样是传id到后台,但不需要再修改url和响应函数的参数
Article的id放在隐藏标签里
Edit_page.html

{% if article%} # 条件判断是是否已存在文章

{% else %}

修改后台响应函数
def edit_action(request):
title = request.POST.get(‘title’, ‘TITLE’)
content = request.POST.get(‘content’, ‘CONTENT’)
article_id = request.POST.get(‘article_id’, ‘0’) # 后一个参数,默认为0
if article_id == ‘0’:

    models.Article.objects.create(title=title, content=content)  # 根据前端回传建立表格
    articles = models.Article.objects.all()
    return render(request, 'blog/index.html', {'articles': articles})   # 返回主页
else:
    article = models.Article.objects.get(pk=article_id) # 获取页面上的id
    article.title = title
    article.content = content
    article.save()
    return render(request, 'blog/article_page.html', {'article': article})

9-1 templates过滤器
什么是过滤器
写在模板中,属于django模板语言
可以修改模板中的变量,从而显示不同的内容

怎么使用过滤器
{{value|filter}}
例子:{{list_names|lenth}} 过滤器显示list长度
过滤器可以叠加:{{value|filter1|filter2|…}}

Edit_page.html
If else条件语句后续不便维护
使用过滤器简化代码
Else里删除,if else endif都删除
Django遇到没有定义的变量,不会报错,只会赋给空值(空字符串)
如果传递空值(非number),会报错:
Field ‘id’ expected a number but got ‘’.
Edit_page.htm修改l
<input type=“hidden” name=“article_id” value={{article.id | default:‘0’}}>
过滤器加入默认数值

更多django 内建过滤器可以继续研究

9-2 shell
什么是django shell
一个python的交互式命令行程序
自动引入了我们的项目环境
可以使用它与我们的项目进行交互

如何使用Django shell
Cmd中输入:Python manage.py shell
From blog.models import Article
Article.objects.all() # 打印所有文章列表

有什么用
进行一些调试工作
测试未知方法
例子:
Article.objects.all().values() # 测试values返回值

9-3 Admin增强
开启runserver
浏览器进入http://127.0.0.1:8000/admin/

进入article
Article添加了一个方法,显示标题
(一)要做多列怎么弄?

Admin.py
admin.site.register(Article)
改变Article注册方式

1、 创建admin配置类
Class ArticleAdmin(admin.ModelAdmin)
注册:admin.site.register(Article,ArticleAdmin) #把父类和配置类绑定

2、 显示其他字段
在配置类中加属性
List_display =(‘title’, ‘content’)
List_display 同时支持tuple和list

(二)添加发布日期
Class Article添加属性
Pub_time = models.DateTimeField(auto_now=True)# 创建对象同时自动设置当前时间

执行数据移植
Cmd:python manage.py makemigrations
Python manage.py migrate

Admin.py

class ArticleAdmin(admin.ModelAdmin):
list_display = (‘title’, ‘content’, ‘pub_time’)

(三)admin.py修改时间
Pub_time = models.DateTimeField(null=True)
重新执行数据移植
Cmd:python manage.py makemigrations
Python manage.py migrate
进入文章,可以修改文章发布时间了

(四)过滤器
Admin.py 中Class ArticleAdmin(admin.ModelAdmin)添加

list_filter = (‘pub_time’,)
tuple只有一个值,也要加逗号

就显示出来根据发布时间过滤的功能

10-1 课程总结

课前准备
开发环境搭建
创建项目及应用
创建项目
创建应用
创建响应页面
第一个templates
重新配置URL
介绍template
开发第一个template
Models
介绍models
编写博客的model
将数据呈现在页面上
Admin
创建超级用户
配置admin
使用
完善博客
博客主页面
内容页面
编辑页面
补充内容
Templates过滤器
Shell
Admin增强

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《Django 3 入门实践》是一本针对初学者的Django入门教程,涵盖了Django 3的基础知识和实践案例。 这本书首先介绍了Django的基本概念和特点,如何安装和配置Django开发环境,以及Django的项目结构和组件。接着,书中详细讲解了如何创建Django应用程序,包括创建模型、视图和模板。读者可以通过这些例子逐步了解Django的开发流程和常用功能。 《Django 3 入门实践》还涵盖了Django的高级功能和实践技巧。例如,它介绍了Django的用户认证系统和权限控制,以及如何处理表单和文件上传。此外,书中还讲解了如何使用Django的ORM(对象关系映射)进行数据库操作,以及如何优化Django应用的性能和安全性。 为了帮助读者更好地理解和应用所学知识,该书还提供了一系列实践案例,涵盖了常见的Web开发需求和场景。通过这些案例,读者可以将所学知识应用到实际项目中,并了解如何构建完整的Django应用。 总的来说,《Django 3 入门实践》是一本适合初学者的Django学习教程。书中内容系统全面,深入浅出,通过实践案例的讲解,读者能够掌握Django的基础知识和实际应用技巧。无论是想入门Django的初学者还是想提升Django技能的开发者,都可以从这本书中获益良多。 ### 回答2: "Django3入门实践"是一本非常受欢迎的Python web框架Django学习指南。这本书适合那些希望学习如何使用Django构建高质量网站和Web应用的初学者。 首先,书中介绍了Django的基本概念和核心功能,比如模型、视图、模板和表单等。这些知识对于理解Django的工作原理至关重要。读者可以通过实际的代码示例和详细的说明来学习如何创建和管理数据库模型,以及如何将数据呈现给用户。此外,书中还介绍了如何使用Django的内置认证系统和权限管理来确保网站的安全和用户验证。 其次,书中深入探讨了Django的高级特性和扩展。例如,它介绍了如何使用Django的路由系统来处理URL映射和页面重定向,以及如何使用Django的ORM来处理复杂的数据库查询和关系。此外,书中还介绍了如何使用Django的表单功能来处理用户输入和验证,以及如何使用Django的静态文件管理和国际化支持等高级功能。 最后,书中还提供了一些实践项目,这些项目可以帮助读者将所学知识应用到实际开发中。通过完成这些项目,读者可以进一步加深对Django的理解和掌握,并在实际项目中应用自己的技能。 总之,"Django3入门实践"是一本很好的入门指南,适合初学者快速入门Django并理解其核心概念和功能。无论是想创建自己的网站,还是希望通过学习Django提升自己的编程技能,这本书都是一个值得推荐的资源。 ### 回答3: 《Django3 入门实践》是一本介绍Django框架的书籍,通过阅读该书可以帮助读者快速入门实践Django3的开发。 这本书从基础概念开始,详细介绍了Django框架的各个组件以及它们的作用,包括模型(Model)、视图(View)、模板(Template)等。读者可以通过逐步学习这些内容来掌握如何使用Django进行Web应用的开发。 书中还提供了大量的实例和案例,通过实际的项目示范,帮助读者理解和掌握Django的开发流程和技巧。这些示例项目涵盖了常见的Web开发需求,如用户认证、数据管理、表单处理、静态文件处理等。读者可以通过跟随书中的示例代码和说明,一步步实践这些项目,并逐渐提升自己的Django开发能力。 此外,《Django3 入门实践》还介绍了Django的一些高级特性和扩展,如管理后台(Admin)的使用、数据库迁移(Migration)、国际化(Internationalization)等。这些内容为读者提供了更多的选择和拓展,使得他们可以根据实际需求使用Django框架构建更加强大和灵活的Web应用。 总之,通过阅读《Django3 入门实践》,读者可以系统地学习实践Django框架的基础知识和开发技巧,为其在Web开发领域打下坚实的基础。无论是想入门Django3的初学者,还是希望提升Django开发能力的开发者,这本书都是一个很好的选择。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

779醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值