前言
Django Admin是Django 提供了基于 web 的管理工具,是 django.contrib 的一部分
一、Django Admin配置代码
在项目的settings.py中的INSTALLED_APPS部分
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'TestModel', # 确保这里的名称与 apps.py 中的 name 属性一致(这部分不是Django Admin)
]
二、使用步骤
访问地址http://127.0.0.1:8000/admin
这个时候我们后台还没有用户,无法正常登陆,可以通过命令python manage.py createsuperuser
来创建超级用户
三、使用后台管理Test模型
修改 TestModel/admin.py
from django.contrib import admin
# Register your models here.
from TestModel.models import Test
admin.site.register(Test)
刷新后台可以看到
三、为Test模型生成关联模型
在TestModel下面的models.py中修改(增加一个文章和评论的表)
from django.db import models
# Create your models here.
class Test(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
age = models.IntegerField()
#自动管理的日期时间,auto_now_add=True 表示在创建对象时自动设置为当前时间
created_at = models.DateTimeField(auto_now_add=True)
# auto_now=True 表示每次保存对象时自动更新为当前时间
updated_at = models.DateTimeField(auto_now=True)
class Article(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
# 外键 author 指向 Test 模型,ForeignKey 定义了一对多关系,即一个作者可以有多篇文章
# on_delete=models.CASCADE 表示删除作者时同时删除其所有文章,当与之关联的 Test 对象被删除时,与之相关的 Article 对象也会被删除
author = models.ForeignKey(Test, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
# __str__ 方法现在返回一个格式化的字符串,其中包含作者的姓名(self.author.name)和文章的标题(self.title)
return f"Article by {self.author.name}: {self.title}"
class Comment(models.Model):
content = models.TextField()
article = models.ForeignKey(Article, on_delete=models.CASCADE)
author = models.ForeignKey(Test, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.content
然后依次执行命令行
# 如果字段变更提示确认ok就直接输入y
python manage.py makemigrations # 模型变更
python manage.py migrate # 创建表结构
刷新数据库可以看到
在前面改的admin.py里面把新加的模型也加入管理
from django.contrib import admin
# Register your models here.
from TestModel.models import Test, Article, Comment
admin.site.register([Test, Article, Comment])
刷新页面
可以自定义管理页面字段来取代默认页面字段显示,比如在add页面,我们想只显示name和email部分,修改 TestModel/admin.py
from django.contrib import admin
# Register your models here.
from TestModel.models import Test, Article, Comment
class TestAdmin(admin.ModelAdmin):
fields = ('name', 'email')
admin.site.register(Test, TestAdmin)
admin.site.register(Article)
admin.site.register(Comment)
新增数据后列表显示
我们再修改一下admin.py
from django.contrib import admin
# Register your models here.
from TestModel.models import Test, Article, Comment
class TestAdmin(admin.ModelAdmin):
fields = ('name', 'email', 'age')
list_display = ('name','age', 'email') # list
admin.site.register(Test, TestAdmin)
admin.site.register(Article)
admin.site.register(Comment)
刷新页面后
给name增加搜索功能,再修改admin.py
from django.contrib import admin
# Register your models here.
from TestModel.models import Test, Article, Comment
class TestAdmin(admin.ModelAdmin):
fields = ('name', 'email', 'age')
list_display = ('name','age', 'email') # list
search_fields = ('name',)
admin.site.register(Test, TestAdmin)
admin.site.register(Article)
admin.site.register(Comment)
在文章新增的时候我们发现author是这样的
我们可以修改下列文件来显示test模型的name
修改models.py
class Test(models.Model):
name = models.CharField(max_length=100)
email = models.EmailField()
age = models.IntegerField()
#自动管理的日期时间,auto_now_add=True 表示在创建对象时自动设置为当前时间
created_at = models.DateTimeField(auto_now_add=True)
# auto_now=True 表示每次保存对象时自动更新为当前时间
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name # 返回 Test 模型的 name 字段值作为字符串表示
优化一下这个下拉框
修改admin.py
from django.contrib import admin
# Register your models here.
from TestModel.models import Test, Article, Comment
class TestAdmin(admin.ModelAdmin):
fields = ('name', 'email', 'age')
list_display = ('name','age', 'email') # list
search_fields = ('name',)
class ArticleAdmin(admin.ModelAdmin):
fields = ('title', 'content', 'author')
list_display = ('title', 'author') # list
search_fields = ('title',)
autocomplete_fields = ['author'] # 使用 autocomplete_fields 来展示外键关联
admin.site.register(Test, TestAdmin)
admin.site.register(Article, ArticleAdmin)
admin.site.register(Comment)
再刷新页面
TestModel是我们创建的一个目录,不要理解为就是test模型,里面可以包含多个模型,可以把这部分理解成一个模块或者一整个项目都行,我们在生成数据表的时候也会以testmodel_
作为表前缀