admin管理后台是django自带的一个组件,它给我们提供了一个管理项目的后台站点,打开该站点,就可以通过图形界面方便的管理项目数据。在项目创建好后,就是默认启用的。
在settings.py中,可以看到它是默认注册好的:
INSTALLED_APPS = [
'django.contrib.admin', # admin 管理后台
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
而在项目的urls.py中,定义了访问admin管理后台的 url :
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls) # 访问 admin管理后台的路径,该路径可以自由设置
]
django admin管理后台默认显示的语言是英语,时区是协调世界时(UTC),与我们的语言和时区不符合。
为了让 admin管理后台显示中文和使用北京时间,我们要在settings.py中设置语言和时区:
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai' # 没写错,是上海,不是北京
这样 admin管理后台就会显示中文,并使用北京时间。
首先要创建管理员,普通用户默认无法登录admin管理后台。
在终端中运行命令:
python manage.py createsuperuser
按照提示输入用户名、邮箱、密码即可完成创建。
运行django项目,然后打开127.0.0.1/admin/
,就进入了admin管理后台的登录页面,输入管理员账户和密码即可登录。
此时,由于我们没有向后台注册任何模型,所以只有一个django自带的“认证和授权”:
想要管理其他模型,只需要在app文件夹下的apps.py中注册模型:
from django.contrib import admin
from . import models
# Register your models here.
admin.site.register(models.UserInfo)
admin.site.register(models.Blog)
admin.site.register(models.Article)
……
重新打开admin管理后台:
注意:
“APP01”是app的名称,想要修改,可以在app文件夹下的apps.py中修改:
from django.apps import AppConfig
class App01Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'app01'
verbose_name = '低仿博客园' # 设置该属性
“Blogs”是模型类的类名加“s”,想要修改,可以在对应的模型类中写入:
class Blog(models.Model):
……
class Meta:
verbose_name = '博客' # 单数形式
verbose_name_plural = '博客' # 复数形式
更多Meta的功能请参考官方文档:传送门
最后的“用户”,是因为我们的用户模型继承了django的AbstractUser
类,所以django直接起了个中文名字叫“用户”。
上述内容修改完毕后的效果:
在设置外键字段关联对象时,会显示“XXX object (X)”,可读性很差,完全不知道该对象是哪一个。
比如,在个一篇文章设置所属博客和所属分类时:
如果想修改显示的内容,就需要在模型类中定义__str__
方法,提高可读性:
class Blog(models.Model):
"""博客"""
site_name = models.CharField(verbose_name='博客名称', max_length=32)
……
def __str__(self):
return self.site_name
class Category(models.Model):
"""文章分类"""
category_name = models.CharField(verbose_name='文章分类', max_length=12)
……
def __str__(self):
return self.category_name
添加之后的效果:
null
和blank
参数的区别在设置某些字段时,明明定义了null=True
,却还是不能留空。这是因为该模型字段没有设置blank=True
。
null
:
如果设置为 True
,当该字段为空时,Django 会将数据库中该字段设置为 NULL
。默认为 False
。
blank
:
如果设置为 True
,该字段允许为空。默认为 False
。
blank
与 null
的 不同:
null
选项仅仅是数据库层面的设置,它只是允许了数据库字段可以为空;而 blank
是涉及表单验证方面。如果一个字段设置为 blank=True
,在进行表单验证时,接收的数据该字段值允许为空,而设置为 blank=False
时,不允许为空。