django Admin常用命令

Django Admin

django-admin 是Django的命令行工具集,用于处理系统相关操作,比如创建管理员账户,忘记密码,应用数据库等等。如果某工程安装了相关app,那么在使用工程命令时只有django默认的命令行。

help

help命令主要用户获取帮助信息,显示django可用的命令,如果要显示某个命令使用python manage.py help shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
root@localhost:/data/djangosite# python manage.py help

Type 'manage.py help <subcommand>' for help on a specific subcommand.

Available subcommands:

[auth] #安装了auth app
changepassword
createsuperuser

[captcha] #captcha app
captcha_clean
captcha_create_pool

[contenttypes]
remove_stale_contenttypes

[django]
check
compilemessages
createcachetable
dbshell
diffsettings
dumpdata
flush
inspectdb
loaddata
makemessages
makemigrations
migrate
sendtestemail
shell
showmigrations
sqlflush
sqlmigrate
sqlsequencereset
squashmigrations
startapp
startproject
test
testserver

[sessions]
clearsessions

[staticfiles]
collectstatic
findstatic
runserver

显示单个命令用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
root@localhost:/data/djangosite# python manage.py help shell
usage: manage.py shell [-h] [--no-startup] [-i {ipython,bpython,python}]
[-c COMMAND] [--version] [-v {0,1,2,3}]
[--settings SETTINGS] [--pythonpath PYTHONPATH]
[--traceback] [--no-color]

Runs a Python interactive interpreter. Tries to use IPython or bpython, if one
of them is available. Any standard input is executed as code.

optional arguments:
-h, --help show this help message and exit
--no-startup When using plain Python, ignore the PYTHONSTARTUP
environment variable and ~/.pythonrc.py script.
-i {ipython,bpython,python}, --interface {ipython,bpython,python}
Specify an interactive interpreter interface.
Available options: "ipython", "bpython", and "python"
-c COMMAND, --command COMMAND
Instead of opening an interactive shell, run a command
as Django and exit.
--version show program's version number and exit
-v {0,1,2,3}, --verbosity {0,1,2,3}
Verbosity level; 0=minimal output, 1=normal output,
2=verbose output, 3=very verbose output
--settings SETTINGS The Python path to a settings module, e.g.
"myproject.settings.main". If this isn't provided, the
DJANGO_SETTINGS_MODULE environment variable will be
used.
--pythonpath PYTHONPATH
A directory to add to the Python path, e.g.
"/home/djangoprojects/myproject".
--traceback Raise on CommandError exceptions
--no-color Don't colorize the command output.

version

显示当前django版本

1
2
root@localhost:/data/djangosite# python manage.py version
2.1.1

changepassword

修改项目中的用户名和密码,前提需要安装auth库并且正确配置用户信息。 输入两次密码即可修改admin用户的密码

1
2
3
4
root@localhost:/data/djangosite# python manage.py changepassword admin
Changing password for user 'admin'
Password:
Password (again):

createsuperuser

创建项目中的管理员账户,前提需要安装auth库并且正确配置数据库。

1
2
3
4
root@localhost:/data/djangosite# python manage.py createsuperuser
username:admin
email:admin@qq.com
password:xxxxxxxx

check

用于检查工程中是否存在错误,用法:python manage.py check [app_lable….]

1
2
3
root@localhost:/data/djangosite#python manage.py check
System check identified no issues (0 silenced).
root@localhost:/data/djangosite#

此时修改一下将url.py改成错误的配置

1
2
3
4
5
6
root@localhost:/data/djangosite#python manage.py check
.........
File "/data/djangosite/apps/users/urls.py", line 24
path('logout/', users_view.LogoutView.as_view(), name="logout"),
^
SyntaxError: invalid syntax

dbshell

Django 会自动进入在settings.py中设置的数据库,这个就和sql终端是一样的
manage.py dbshell or manage.py dbshell –database db1 如果配置多数据库的情况下,可以指定进入哪个数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
root@localhost:/data/djangosite# python manage.py dbshell 
mysql: [Warning] Using a password on the command line interface can be insecure.
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10365662
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

migrate

将修改应用到数据库,如果不加任何参数默认会将所有应用程序的models.py更新到数据库,可以单独指定app更新到数据库。默认应用到数据库后会记录到django_migrations数据表中。

手动指定撤销到指定的migration文件

1
python manage.py migrate users 0002_account_user

如果手动更新了数据库可以什么–fake参数

解决migrate命令报错的解决方法:

  1. 终极解决方案原理:就是将之前的那些迁移脚本都不用了。重新来过。要将出问题的app下的所有模型和数据库中表保持一致,重新映射。
  2. 将出问题的app下的所有模型,都和数据库中的表保持一致。
  3. 将出问题的app下的所有迁移脚本文件都删掉。再在django_migrations表中将出问题的app相关的迁移记录都删掉。
  4. 使用makemigrations,重新将模型生成一个迁移脚本。
  5. 使用migrate –fake-initial参数,将刚刚生成的迁移脚本,标记为已经完成(因为这些模型相对应的表,其实都已经在数据库中存在了,不需要重复执行了。)
  6. 可以做其他的映射了。

makemigrations

根据model的变化生成对应的python代码,该代码用于更新数据库。代码会存放于每个工程目录下的migrations 目录下。该目录默认包含init.py文件。

1
2
3
4
migrations/
├── 0001_initial.py
├── 0002_account_user.py
├── 0003_auto_20181129_1941.py

sqlmigrate

输出某一migrate所对应的SQL语句。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@localhost:/data/djangosite# python manage.py sqlmigrate users 0001_initial
2018-12-01 10:00:00
2018-12-01 10:00:00
BEGIN;
--
-- Create model User
--
CREATE TABLE `users_user` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `password` varchar(128) NOT NULL, `last_login` datetime(6) NULL, `is_superuser` bool NOT NULL, `username` varchar(150) NOT NULL UNIQUE, `first_name` varchar(30) NOT NULL, `last_name` varchar(150) NOT NULL, `email` varchar(254) NOT NULL, `is_staff` bool NOT NULL, `is_active` bool NOT NULL, `date_joined` datetime(6) NOT NULL, `mobile` varchar(20) NOT NULL, `PIN` varchar(20) NOT NULL);
CREATE TABLE `users_user_groups` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `user_id` integer NOT NULL, `group_id` integer NOT NULL);
CREATE TABLE `users_user_user_permissions` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `user_id` integer NOT NULL, `permission_id` integer NOT NULL);
--
-- Create model History
--
CREATE TABLE `users_history` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `user` varchar(50) NULL, `login_time` datetime(6) NOT NULL, `logout_time` datetime(6) NOT NULL, `login_status` varchar(11) NULL, `user_ip` char(39) NOT NULL, `create_time` datetime(6) NOT NULL, `update_time` datetime(6) NOT NULL);
ALTER TABLE `users_user_groups` ADD CONSTRAINT `users_user_groups_user_id_5f6f5a90_fk_users_user_id` FOREIGN KEY (`user_id`) REFERENCES `users_user` (`id`);
ALTER TABLE `users_user_groups` ADD CONSTRAINT `users_user_groups_group_id_9afc8d0e_fk_auth_group_id` FOREIGN KEY (`group_id`) REFERENCES `auth_group` (`id`);
ALTER TABLE `users_user_groups` ADD CONSTRAINT users_user_groups_user_id_group_id_b88eab82_uniq UNIQUE (`user_id`, `group_id`);
ALTER TABLE `users_user_user_permissions` ADD CONSTRAINT `users_user_user_permissions_user_id_20aca447_fk_users_user_id` FOREIGN KEY (`user_id`) REFERENCES `users_user` (`id`);
ALTER TABLE `users_user_user_permissions` ADD CONSTRAINT `users_user_user_perm_permission_id_0b93982e_fk_auth_perm` FOREIGN KEY (`permission_id`) REFERENCES `auth_permission` (`id`);
ALTER TABLE `users_user_user_permissions` ADD CONSTRAINT users_user_user_permissions_user_id_permission_id_43338c45_uniq UNIQUE (`user_id`, `permission_id`);
COMMIT;

showmigrations

显示migrations记录
如果已经应用到数据库中前面[]后显示[X],否则为[] 使用-p显示所有记录 -l 按应用程序显示记录。

1
2
3
4
5
6
7
8
9
10
root@localhost:/data/djangosite# python manage.py showmigrations users 

users
[X] 0001_initial
[X] 0002_auto_20181223_1302
[X] 0003_auto_20181223_1316
[X] 0004_verifycode
[X] 0005_auto_20190104_1141
[X] 0006_auto_20190216_1647
[X] 0007_user_region

startproject

创建django工程,会在当前目录创建一个文件夹,文件夹下包含manage.py文件以及工程文件夹,同时在工程文件夹下包含settings.py文件及其它文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
root@localhost:/djangodir# django-admin startproject djangosite
root@localhost:/djangodir# ls
djangosite
root@localhost:/djangodir# tree djangosite
djangosite
├── djangosite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

1 directory, 5 files

startapp

创建django app应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@localhost:/djangodir/djangosite# python manage.py startapp users
root@localhost:/djangodir/djangosite# dir
djangosite manage.py users
root@localhost:/djangodir/djangosite# tree
.
├── djangosite
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-36.pyc
│   │   └── settings.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── users
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

4 directories, 14 files

collectstatic

python manage.py collectstatic在执行时,django默认会去查看定义在STATICFILES_DIRS里的目录,以及在INSTALLED_APPS里定义了的app的static目录。如果这些目录下有文件,则把文件全部收集起来,拷贝到STATIC_ROOT目录下。当使用django的runserver时,如果请求的是一个静态文件,django也是会默认查看上述的ROOT、DIRS和static目录。但是,在部署到服务器上时,此规则就不使用了。

配置setting.py

1
2
3
4
5
STATICFILES_DIRS = [ 
os.path.join(BASE_DIR, "static/"),
]
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles/")

执行命令后会去收集静态资源文件放于STATIC_ROOT文件夹下

STATIC_ROOT 是在部署的时候才发挥作用, 而实际情况下,静态文件的一般安放位置有两种:

1.一种就是在每个app里面新建一个static文件夹,将静态文件放到里面,在加载静态文件时,比如要在模板中用到静态文件,django会自动在每个app里面搜索static文件夹(所以,不要把文件夹的名字写错哦, 否则django就找不到你的文件夹了)

2.另一种,就是在所有的app文件外面,建立一个公共的文件夹, 因为有些静态文件不是某个app独有的,那么就可以把它放到一个公共文件夹里面,方便管理(注意,建立一个公共的静态文件的文件夹只是一种易于管理的做法,但是不是必须的,app是可以跨app应用静态文件的,因为最后所有的静态文件都会在STATIC_ROOT里面存在)
那现在的问题是如何让django知道你把一些静态文件放到app以外的公共文件夹中呢,那就需要配置STATICFILES_DIRS了

1
root@localhost:/djangodir/djangosite# python manage.py collectstatic

runserver

在当前机器上启动工程,默认是一个轻量的web服务器,只作为测试用,默认端口为8000,默认监听127.0.0.1:8000
修改默认监听和端口

1
2
3
4
5
6
7
root@localhost:/djangodir/djangosite# python manage.py runserver 0.0.0.0:8001  #修改默认监听
Performing system checks...

System check identified no issues (0 silenced).
Django version 2.1.1, using settings 'djangosite.settings'
Starting development server at http://0.0.0.0:8001/
Quit the server with CONTROL-C.

shell

启动django工程交互,默认情况下使用ipython启动的交互默认,可以自动补全,需要提前安装。在交互窗口下可import 测试相关语法等

1
2
3
4
5
6
root@localhost:/djangodir/djangosite# python manage.py shell
Python 3.6.7 (default, Oct 25 2018, 09:16:13)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>