博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Django基础 - 03管理后台admin

Posted on 2023-04-05 22:34  Kingdomer  阅读(26)  评论(0编辑  收藏  举报

 

一、Admin管理 

1.1 创建超级用户 createsuperuser

(venv) E:\PythonLearn\djangoDemo\helloDjango>python manage.py createsuperuser
Username (leave blank to use 'sun'): admin
Email address: admin@kunking.com
Password:
Password (again):
The password is too similar to the email address.
This password is too short. It must contain at least 8 characters.
This password is too common.
Password:
Password (again):
The password is too similar to the email address.
Password:
Password (again):
Superuser created successfully.

1.2 调整应用的默认语言和时区

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

1.3 配置 helloDjango/settings.py  

urlpatterns = [
    path('admin/', admin.site.urls),
]

1.4 启动后登录: http://127.0.0.1:8000/admin

 

二、admin站点管理

2.1 配置Model类属性

class UserEntity(models.Model):
    name = models.CharField(max_length=20, verbose_name='账号')
    age = models.IntegerField(default=0, verbose_name='年龄')
    phone = models.CharField(max_length=11, verbose_name='手机号',  blank=True, null=True)

    class Meta:
        db_table = 't_user'
        verbose_name = '客户管理'
        # 设置复数的表示方式
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

2.2 编写mainapp/admin.py; 配置后台管理的属性

class UserAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'phone')

# 将模型添加到站点中
admin.site.register(UserEntity, UserAdmin)

 

   

 

2.3 添加分页、过滤器、搜索框条件; 字段名称

class UserAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'phone')  # 列表中显示的字段
    list_per_page = 2                       # 每页显示的记录数量
    list_filter = ('id', 'phone')           # 过滤器
    search_fields = ('id', 'phone')         # 搜索关键字的字段

 

blank=True # 站点的表单字段值可以为空
null=True  # 数据库的字段可以为空
    name = models.CharField(max_length=20, verbose_name='账号')
    age = models.IntegerField(default=0, verbose_name='年龄')
    phone = models.CharField(max_length=11, verbose_name='手机号',  blank=True, null=True)

  

 

三、 案例: 水果管理

3.1 定义Models

class CategoryEntity(models.Model):
    name = models.CharField(max_length=20, verbose_name='分类名称')
    order_num = models.IntegerField(verbose_name='排序')

    def __str__(self):
        return self.name

    class Meta:
        db_table = 't_category'
        ordering = ['-order_num'] # 排序字段,- 表示降序
        verbose_name = '水果分类'
        verbose_name_plural = verbose_name

  

class FruitEntity(models.Model):
    name = models.CharField(max_length=20, verbose_name='水果名称')
    price = models.FloatField(verbose_name='价格')
    source = models.CharField(max_length=30, verbose_name='原产地')
    category = models.ForeignKey(CategoryEntity, on_delete=models.CASCADE)

    class Meta:
        db_table = 't_fruit'
        verbose_name = '水果表'
        verbose_name_plural = verbose_name

  

3.2 定义后台管理ModelAdmin

class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'order_num')

class FruitAdmin(admin.ModelAdmin):
    list_display = ('name', 'source', 'price', 'category')

# 将模型添加到站点中
admin.site.register(CategoryEntity, CategoryAdmin)
admin.site.register(FruitEntity, FruitAdmin)

  

 

3.3 添加数据报错

环境: Python3.9 Django=2.0.1
django.db.utils.OperationalError: no such table: main.auth_user__old

# 升级Django到 2.1.5
(venv) E:\PythonLearn\djangoDemo\helloDjango>pip install Django==2.1.5
# 删除mainapp/migrations 目录 和 db.sqlite3 文件
# 重新迁移数据
(venv) E:\PythonLearn\djangoDemo\helloDjango>python manage.py makemigrations
(venv) E:\PythonLearn\djangoDemo\helloDjango>python manage.py migrate

(venv) E:\PythonLearn\djangoDemo\helloDjango>python manage.py makemigrations mainapp
(venv) E:\PythonLearn\djangoDemo\helloDjango>python manage.py migrate mainapp