Django入门基础详解
本次使用django版本2.1.2
安装django
安装最新版本
pip install django
安装指定版本
pip install django==1.10.1
查看本机django版本
pip show django
创建项目
创建一个项目文件夹(如:django),在此文件夹中打开Powershell 或 打开DOS切换到此目录执行如下命令:
django-admin startproject my_site
- django-admin startproject:是固定的创建项目命令
- my_site:是创建的项目名称,自己随意取名
当执行创建项目名称后django会自动生成那些必要的文件,也可以执行django-admin startproject Blog .
创建一个Python的包。
启动项目
进入django/my_site文件执行以下命令:
django manage.py runserver
D:\xuexi\python\django\my_site>
>>> python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
You have 15 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
October 14, 2018 - 11:48:52
Django version 2.1.2, using settings 'my_site.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
也可以指定端口:python manage.py runserver 127.0.0.1:8081
根据运行后的提示访问http://127.0.0.1:8000
更改Django默认语言
上面访问后页面是英语感觉看着不习惯,后面会讲到管理页面也是英语,如下我们来更改配置实现中文展示:
进入D:\xuexi\python\django\my_site\my_site\settings.py搜索
LANGUAGE_CODE
大概长这样:## 其它配置代码... LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC' ## 其它配置代码...
变更为:
## 其它配置代码... LANGUAGE_CODE = 'zh-hans' # 把英文改为中文 TIME_ZONE = 'Asia/Shanghai' # 把国际时区改为中国时区 ## 其它配置代码...
保存文件 -> 刷新浏览器
创建应用
项目已经创建好了,网站也有了,接下来要实现网站的具体功能。在Django中,通常把这些功能称为“应用”(application)。
进入刚才创建的项目目录中,即manage.py
文件所在目录,然后执行下面代码:
D:\xuexi\python\django\my_site>
>>> python manage.py startapp blog
执行后的目录结构:
blog就是在项目my_site中新建的项目。当新的应用创建后,Django会自动在这个应用中增加一些文件。目前这已经是一个相对完善的网站结构。
django常用命令
网站配置(应用注册到项目)
前面仅仅是创建了应用,还没有将应用注册到本项目中,因此暂时不能访问。
在Django项目中,在./my_site/setting.py
文件中进行信息注册,setting.py
常用配置如下:
DEBUG: 其值为True 或者False,在开发过程中需要设置成True,在测试功能时,Django能够显示详细的报错信息–这是“开发模式”。如果将项目部署到真正要对外发布的服务器上,我们称之为“生产环境”,必须将其值修改为False,从而避免暴露项目的内部信息。
ALLOWED_HOSTS: 在DEBUG为True时,其值为空。当部署到生产环境中时,要把主域名填写到这里,才能通过域名访问到本站。
INSTALLED_APPS: 这是一个非常重要的配置项,所有的应用只有写到这里才能生效。默认情况下,已经有了一些应用,比如
django.contrib.admin
就是针对项目后台管理的应用。如我们前面新建了一个blog应用,那我们就需要把应用配置到这里,如下:INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog', # <---------------------新增的应用添加到下方格式跟上面其他应用一样,'xxx',
]
DATAVASES: 在这里可以配置数据库。Django能够支持多种数据库,如常见的MySQL、Oracle等。默认配置SQLite,因为这个数据库小巧灵活,还是Python标准库所支持的。
LANGUAGE_CODE: 设置项目的语言,一般情况下可以不用修改,如果非要用汉语,则设置为LANGUAGE_CODE=‘zh-hans’(注意不是’zh-cn’)。
TIME_ZONE: 设置时区,通常使用东八区,设置为’Asia/Shanghai’.
数据模型类(迁移数据库)
利用Django开发网站系统,一般情况下,要先编写数据模型,就是在./blog/models.py
中写一个类,这个类与数据库表具有对应关系,Django中我们不需要执行sql语句来创建表,它已经帮我们做了一些事情。Django 把那一套数据库的语法转换成了 Python 的语法形式,我们只要写 Python 代码就可以了,Django 会把 Python 代码翻译成对应的数据库操作语言。用更加专业一点的说法,就是 Django 为我们提供了一套 ORM(Object Relational Mapping)系统。
blog/models.py
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogArticles(models.Model):
"""
Django 要求模型必须继承 models.Model 类。
CharField 指定了分类名 title 的数据类型,CharField 是字符型,
CharField 的 max_length 参数指定其最大长度,超过这个长度的分类名就不能被存入数据库。
当然 Django 还为我们提供了多种其它的数据类型,如日期时间类型 DateTimeField、整数类型 IntegerField 等等。
Django 内置的全部类型可查看文档:
https://docs.djangoproject.com/en/1.10/ref/models/fields/#field-types
"""
title = models.CharField(max_length=300) # 设置为字符类型最大输入长度为30
author = models.ForeignKey(User,related_name='blog_posts, on_delete=models.CASCADE') # 一对多关系(一个用户可以创建多篇文章),on_delete在Django2.x以上必须写这个参数(大概意思是删除这个外键时删除其他表对应的数据)
"""
这里 User 是从 django.contrib.auth.models 导入的。
django.contrib.auth 是 Django 内置的应用,专门用于处理网站用户的注册、登录等流程,User 是 Django 为我们已经写好的用户模型。
这里我们通过 ForeignKey 把文章和 User 关联了起来。
因为我们规定一篇文章只能有一个作者,而一个作者可能会写多篇文章,因此这是一对多的关联关系,和 Category 类似。
"""
body = models.TextField() # 设置为文本字段
publish = models.DateTimeField(default=timezone.now) # 默认本地时间
class Meta:
ordering = ('-publish',) # 设置BlogArticles的实例对象按照publish字段的倒叙显示
def __str__(self):
return self.title
BlogArticles
就是一个标准的 Python 类,它继承了models.Model类,类名为 BlogArticles 。BlogArticles
类有一个属性 title,它是models.CharField的一个实例。
这样,Django 就可以把这个类翻译成数据库的操作语言,在数据库里创建一个名为 BlogArticles
的表格,可以看出从 Python 代码翻译成数据库语言时其规则就是一个 Python 类对应一个数据库表格,类名即表名,类的属性对应着表格的列,属性名即列名。
BlogArticles
的数据模型编写好了,将来的数据表的基本结构就是按照上述各字段及其属性而定的,接下来根据数据模型建立数据库表,执行以下命令:
开始迁移
1、在./my_site/manage.py
执行python manage.py makemigrations
命令
D:\xuexi\python\django\my_site (master)
>>> python manage.py makemigrations
Migrations for 'blog':
blog\migrations\0001_initial.py
- Create model BlogArticles
- 当我们执行了
python manage.py makemigrations
后,Django 在 blog 应用的 migrations 目录下生成了一个0001_initial.py
文件,这个文件是 Django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在models.py
文件里创建了1
个模型类,Django 把这些变化记录在了 0001_initial.py 里
我们也可以使用manage.py
来查看以下转换后的预执行内如:
D:\xuexi\python\django\my_site (master)
>>> python manage.py sqlmigrate blog 0001
BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_blogarticles_author_id_ed798e23" ON "blog_blogarticles" ("author_id");
COMMIT;
可以看到转换后其实就是一些建表语句而已。
2、继续执行python manage.py migrate
命令
D:\xuexi\python\django\my_site (master)
>>> python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying blog.0001_initial... OK
Applying sessions.0001_initial... OK
- 第一步只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了
python manage.py migrate
命令。Django 通过检测应用中migrations
目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库(说白了就是这两个步骤把我们在models.py里面写的python语句翻译成sql并执行)。
3、使用管理打开我们项目中的db.sqlite3
文件:
Firefox安装sqlite工具插件(注意安装插件时使用Firefox打开链接)
从上面看出django已成功帮我创建了数据表。
发布博客文章
1、首先执行python manage.py createsuperuser
创建超级管理员
D:\xuexi\python\django\my_site (master)
>>> python manage.py createsuperuser
用户名 (leave blank to use 'xxxx'): admin
电子邮件地址: xxx@163.com
Password:
Password (again):
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
2、执行python manage.py runserver
启动服务
D:\xuexi\python\django\my_site (master)
>>> python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
October 16, 2018 - 22:25:14
Django version 2.1.2, using settings 'my_site.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
3、使用浏览器访问http://localhost:8000/admin/
,输入前面创建的超级管理员账户和密码。
登陆后大概长这样:
界面所显示的用户和组都是应用中默认的。
4、在后台注册自己创建的模型,在以下路径./django/my_site/blog/admin.py
文件中添加以下代码
from django.contrib import admin
# Register your models here.
from django.contrib import admin
from .models import BlogArticles # 将BlogArticles引入到当前环境
admin.site.register(BlogArticles) # 将BlogArticles注册到admin
再次刷新浏览器,查看我们新注册的模型已经可以在后台管理页面看到了,如下图:
点击增加一篇文章
sqlite中也可以看到我们在管理平台看到的数据了
5、添加文章后页面显示看着挺单一,现在来改变admin.py
让页面编的不在那么单调,具体代码如下:
from django.contrib import admin
# Register your models here.
from django.contrib import admin
from .models import BlogArticles # 将BlogArticles引入到当前环境
class BlogArticlesAdmin(admin.ModelAdmin): #
list_display = ("title", "author", "publish") # 管理页面需要展示的字段
list_filter = ("publish", "author") # 设置(页面右侧)可以publish 和 author过滤
search_fields = ("title", "body") # 设置页面支持title 和 body搜索
raw_id_fields = ("author",)
date_hierarchy = "publish" # 设置按可以按时间选择
ordering = ['publish', 'author'] # 设置以publish 和 author来进行排序
admin.site.register(BlogArticles, BlogArticlesAdmin) # 将BlogArticles注册到admin
重新刷新页面:
Django入门基础详解的更多相关文章
- 【入门详解】MyBatis入门基础详解
什么是mybatis? MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索.MyBatis使用简单的XM ...
- Django入门------基础(1)
基础 Django 是用 Python 写的一个自由和开放源码 web 应用程序框架.web框架是一套组件,能帮助你更快.更容易地开发web站点.当你开始构建一个web站点时,你总需要一些相似的组件: ...
- 深入浅出DOM基础——《DOM探索之基础详解篇》学习笔记
来源于:https://github.com/jawil/blog/issues/9 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西 ...
- (十八)整合Nacos组件,环境搭建和入门案例详解
整合Nacos组件,环境搭建和入门案例详解 1.Nacos基础简介 1.1 关键特性 1.2 专业术语解释 1.3 Nacos生态圈 2.SpringBoot整合Nacos 2.1 新建配置 2.2 ...
- Dom探索之基础详解
认识DOM DOM级别 注::DOM 0级标准实际并不存在,只是历史坐标系的一个参照点而已,具体的说,它指IE4.0和Netscape Navigator4.0最初支持的DHTML. 节点类型 注:1 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- javaScript基础详解(1)
javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...
- Python学习一:序列基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...
- Python学习二:词典基础详解
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7862377.html 邮箱:moyi@moyib ...
随机推荐
- McQueenRPC源码阅读
1.server 2.client 3.消息格式
- WSGI、uwsgi和uWSGI
一.WSGI WSGI ( Web Server Gateway Interface )是一个网络服务器和网络应用的通用接口的规范或者用于Python框架. 由于python开发人员在网络框架的选择限 ...
- 如何在 JS 中嵌入大量 HTML 代码 --更新2017-10-10 16:37:09
一.一般方式 方式1:\ 要写在标签后面,看例子 var longString = "\ ------------------------\ ------------------------ ...
- Javascript - Jquery - 其它
Ajax函数 $.ajax(url, type, success, error)//url:请求的页面路径//type:请求方式//success:请求成功的回调,该函数有两个参数:服务器返回数据(d ...
- 20165234 [第二届构建之法论坛] 预培训文档(Java版) 学习总结
[第二届构建之法论坛] 预培训文档(Java版) 学习总结 我通读并学习了此文档,并且动手实践了一遍.以下是我学习过程的记录~ Part1.配置环境 配置JDK 原文中提到了2个容易被混淆的概念 JD ...
- Battery historian安装及使用
在介绍Battery historian之前首先来介绍一下 Android adb bugreport 工具,bugreport是什么,怎么用? android系统想要成为一个功能完备,生态繁荣的操作 ...
- Python学习笔记-数字类型
如何定义一个数字类型 定义var1为一个INT类型,所以在5/3 输出的是 1. var1 = 5 var1=var1/3 print var1 定义var1为一个INT类型,因为var1是INT类型 ...
- 正则表达式、BeautifulSoup、Lxml进行性能对比
爬取方法 性能 使用难度 安装难度 正则表达式 快 困难 简单(内置) BeautifulSoup 慢 简单 简单 Lxml 快 简单 相对困难
- RTL8201EL介绍【转】
转自:https://blog.csdn.net/Firefly_cjd/article/details/79826698 本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- 题解-bzoj3569 DZY Loves Chinese II
Problem bzoj 题意概要:给定\(n\)点\(m\)边无向连通图,\(Q\)次询问删除\(k\)条边后是否仍然连通,强制在线 Solution 半年前考到过这类题目(询问删除任意两条边使得图 ...