笔记内容
课程地址: https://www.imooc.com/learn/790
创建项目
新建项目
: django-admin startproject <项目文件名>
项目目录结构
这是项目的一个目录
包含项目最基本的一些配置
目录名称不建议修改
-
manage.py
-
与项目进行交互的命令行工具集的入口
项目管理器
执行 python manage.py来查看所有命令
runserver
-
django有一个小型的服务器
启动服务器: python manage.py runserver
然后在浏览器中输入 http://127.0.0.1:8000/ 或者 http://localhost:8000/
运行成功
改变端口号: python manage.py runserver <端口号>
wsgi.py
-
WSGI(Python Web Gateway Interface)
Python应用与Web服务器之间的接口
urls.py
-
URL配置文件
Django项目中所有页面都需要我们去配置其URL
settings.py
- 最核心的配置文件
变量 | 含义 |
---|---|
BASE_DIR | 根目录 |
SECRET_KEY | 安全码(项目创建上会自动生成) |
DEBUG | 打开:错误会直接抛给前端 ps:You are seeing this page because DEBUG=True is in your settings file and you have not configured any URLs. |
ALLOWED_HOSTS | 允许访问的客户名(如果设定为ALLOWED_HOSTS = [‘localhost’],那么两种方法http://127.0.0.1:8000/ 和 http://localhost:8000/,前者的地址会被屏蔽,抛出“400”的错误 ) |
INSTALLED_APPS | 默认生成自带的应用,如果创建了我们的应用,就必须写到这个列表里面 |
MIDDLEWARE | 自带工具集 |
ROOT_URLCONF | url根文件,默认指向urls.py |
TEMPLATES | django中模版就是一个个的文件 |
WSGI_APPLICATION | 和wsgi相关的一律不做改动 |
DATABASES | 数据库配置,默认sqlite3,若使用其他的数据库可以在https://docs.djangoproject.com/en/2.1/ref/settings/#databases 中找到相关配置方法 |
AUTH_PASSWORD_VALIDATORS | 密码认证有关 |
LANGUAGE_CODE | 语言 |
STATIC_URL | 静态文件的地址,如css,html,JavaScript,图片等 |
-
init.py
- 声明模块的文件
创建应用
步骤
- 在项目中进入和manage.py同级目录中
- 命令行输入:python manage.py startapp <应用名> --> 多一个文件夹,文件名为应用名(应用名不能和python中的模块名相同)
- 添加应用名到settings.py中的INSTALLED_APPS里面(直接加应用名即可)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog'
]
目录结构
-
migrations
- 数据移植模块 admin.py
- 该应用的后台系统管理配置 app.py
- 该应用的一些配置 models.py
-
数据模块
使用ORM框架
test.py
- 自动化测试模块 views.py
-
执行响应的代码所在模块
项目中 大部分代码所在的位置
创建一个Hello, World!
-
编辑
views.py 文件
-
每个响应对应一个函数,函数必须返回一个响应
函数必须存在一个参数,一般规定俗称: request
每一个响应函数对应一个URL
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse('Hello, World!')
-
配置URL
-
import相应的模块:
import blog.views as bv
每个URL都以url的形式写出来
url函数放在urlpatterns列表中 path(‘index/’, bv.index)
url函数三个参数:URL,对应方法,名称
运行
- 启动服务器: python manage.py runserver<\kbd>
- 浏览器输入: http://localhost:8000/index/ (注意后面要加/index)
第一个Template
配置URL
-
包含其他的URL
- 在根 urls.py 中引入include,同时url函数的第二个参数是 include(‘blog.url’)(blog是应用名)
- 在APP应用下创建一个 urls.py 文件,格式与根 urls.py 相同
- 根 urls.py针对app配置的URL名称,是该app所有URL的总路径
- 注意:
-
- 如果应用文件下的url函数第一个参数是’^$’(正则项,即为空字符串),才能限制URL为 http://localhost:8000/blog/;不能用‘’代替,因为此种情况下url可以为http://localhost:8000/blog/<任何字符串>
-
- 使用的时候需要小心,因为如果这个参数是^index$那么输入网址http://localhost:8000/blog/index会出现404错误
-
- 正确的方法应该是把参数改为 ^index/$ ,输入同样的网址就不会出错
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url('admin/', admin.site.urls),
url('blog/', include('blog.urls')),
]
from django.conf.urls import url
from . import views
urlpatterns = [
url('^/$', views.index),
]
Templates介绍
-
Templates概念
- HTML文件
- 使用了django模版语言(DTL)
- 可以使用第三方模版(如Jinja2) 步骤
- 在app根文件下创建一个名为 Templates的目录(Directory)
- 在此目录中创建一个 HTML 文件
- 在 views.py 中返回一个 render() DTL使用方法
- render()第三个参数:传递数据到前端,是一个 dict类型的参数
- 该字典是后台传递到模版的参数,键为参数名
- 在模版中使用 {{参数名}}来直接使用
from django.db import models
# Create your models here.
class Article(models.Model):
title = models.CharField(max_length=64, default='Title')
content = models.TextField(null=True)
-
解决templates冲突的方法
- 在app目录下的 Templates目录创建一个以app名为名的目录
- 将 index.html放入此目录中
Models
models
-
Django中的models
- 一个 model对应数据库的一张 表
- django中的models以 类的形式展现
- 包含了一些 基本字段和数据的一些 行为 ORM
- 对象关系映射
- 实现了 对象和数据库之间的映射
- 隐藏了数据访问的细节,不需要编写SQL语句 步骤
- 在根目录中创建一个 models.py ,并引入models模块
- 创建类,继承 models.Model, 该类是一张数据表
- 在类中创建字段,字段即类中的 属性(变量) 生成数据表
- 命令行中进入 manage.py 同级目录
- 执行 python manage.py makemigrations <app名称> 不写app名称表示所有app都生成 查看
- django会在应用的migrates文件夹中自动生成移植文件
- 查看SQL执行: python manage.py sqlmigrate <应用名> <文件ID> (文件ID是指:应用文件夹的migrations文件夹内自动生成的 xxxx_initial.py ,xxxx即为文件ID)
- 用于查看修改 db.sqlite3的轻量级软件:
- 1)SQLite Expert Personal (Win)
- 2)DB Browser for SQLite(Mac) 页面呈现数据-后台步骤
- views.py中 from . import models
- 加入代码: article = models.Articles.objects.get(pk=1) (pk的值相当于id,用title,content也可以的)
-
通过render 把对象传递到前端:
render(request, page, {‘article’:article})
views.py
from django.shortcuts import render
from . import models
# Create your views here.
def index(request):
article = models.Article.objects.get(pk = 1)
return render(request, 'blog/index.html', {'article':article})
-
页面呈现数据-前端步骤
- 模版可以直接使用对象以及对象的 .操作: {{article.content}}或者 {{article.title}}
index.html
<body>
<h1>{{article.content}}</h1>
<h1>{{article.title}}</h1>
</body>
-
小节总结
- 在应用文件夹中:
- 1) models.py 定义我们的各种模型
- 2) urls.py 定义我们应用中的各种URL(这些网页要存在于在Templates/blog/文件夹之内)
- 3) views.py 定义我们的响应函数,最后用render函数来传给前端数据
- 4) admin.py 中要注册我们定义好的各种模型
- 我们最后的网址: localhost:8000/ 根目录 urls.py 定义的url/ 应用文件夹的 urls.py 定义的url/
Admin
-
Admin介绍
- admin是django自带的 自动化数据管理界面
- 被授权的用户可以直接在admin中管理数据库
- django提供了许多针对admin的 定制功能 配置Admin
- 创建用户: python manage.py createsuperuser
- 启动服务器,浏览器输入网址: localhost:8000/admin,登陆用户
- 如果要设置界面的语言为汉语,需要在 settings.py 文件中中设置: LANGUAGE_CODE = ‘zh_Hans’ 配置应用
- 对应用文件夹下的 admin.py 文件进行配置
- 配置语句: admin.site.register(Article)
from django.contrib import admin
from .models import Article
admin.site.register(Article)
-
修改数据默认显示的名称
- 在Article类( 已在models.py 中定义 )中添加一个方法
- 方法中返回自定义的名称,如:想要返回文章的题目则直接编写 return self.title
- 此方法的命名如下
# python3以上的版本命名
def __str__(self):
#python2.7版本命名
def __unicode__(self):
搭建博客
写好的东西因为突然电脑没电gg了 有机会再补吧
templates过滤器
-
使用过滤器
-
{{value | filter}}
-
例子:
{{list_nums | length}}
(显示的内容不是list,而是list的长度) -
过滤器可叠加:
{{value | filter1 | filter2 | ...}}
django shell
概念
- 是一个python的交互式命令行程序
- 自动引入我们项目的环境,和项目进行交互
使用
python manage.py shell
from blog.models import Article
Article.objects.all()
作用
- 可以进行调试工作
- 测试未知的方法
admin
创建一个admin的配置类
- 在 admin.py 中:
class ArticleAdmin(admin.modelAdmin):
pass
admin.site.register(Article, ArticleAdmin)
显示其他字段
-
list_display = ('title', 'content', 'pub_time')
(list和tuple都可以) -
这里的字段名必须是字符串
-
不能修改时间:
pub_time = models.DateTimeField(auto_now=True)
-
修改时间:
pub_time = models.DateTimeField(null=True)
-
记得要移植
过滤器
- list_filter = (‘pub_time’, ) (tuple中只有一个元素要加逗号)