Backend - Django Admin 后台管理

目录

一、admin 后台编辑

(一)admin.py中设置modelAdmin类

1. form

2. list_display

3. ordering

4. search_fields

5. exclude

6. fields

(二)settings.py中的ADMIN_REORDER里添加model模块

二、admin 导航栏的显示问题

1. admin.py里,注册该model的admin。

(1)用 admin.site.register(Book)

(2)或用 @admin.register(Book)

2. settings.py里,在ADMIN_REORDER中,添加该model。

3. settings.py里,在INSTALLED_APP中,添加项目app。

4. models.py里,检查fields等写法正确。

5. 检查model名称是否一致。

6. 检查是否存在写法问题(比如下方,缺少逗号)。

三、admin 表单

(一)管理后台 admin 的表单进行空值验证

(二)前端使用form进行空值验证

1. 在 form.py 中写表单

2. 在使用 views.py 中验证

(三)admin表单设置输入框默认值 

四、ManyToMany

(一)基本用法

1. 设置 models.py 文件的 model 类

2. 设置 admin.py 文件的 admin 类

(1)设置 fields 属性

(2)设置 filter_horizontal 属性

(二)limit_choices_to

(三)ManyToManyField 新增数据记录

五、model 里的 __str__ 方法

六、Django Admin 登录不进去

(一)首先查看数据库中是否有用户

(二)若没有用户数据,创建登录用户。

1. 正常创建用户

2. 密码不合规,仍能成功创建

(三)若只是忘记密码

七、常见问题

(一)Django管理后台报错  operator does not exist: bigint = character varying 

(二)当Django管理后台报错: invalid input syntax for type bigint: "XXX"


一、admin 后台编辑

(一)admin.py中设置modelAdmin类

1. form

        自定义表单。

2. list_display

        显示字段。

        即,在管理列表页面中,显示所需字段。

3. ordering

        排序。

        即,在管理列表页面中,对所需字段进行排序。

4. search_fields

        搜索。

        即,在管理列表页面中,显示搜索框,并可针对所需字段进行查询。

5. exclude

        排除。

        即,在管理列表页面中,排除不想展示的字段。

6. fields

        编辑字段。

        即,在编辑 or 新增页面中,需要编辑的字段。

这六点的完整例子如下:

# 建立表单
class bookForm(forms.ModelForm):
    author = forms.ModelChoiceField(label='AUTHOR', queryset=Author.objects.filter(area='Chengdu').order_by('id'))

    class Meta:
        model = Book
        fields = '__all__'
     
# 建立admin后台界面
class BookAdmin(admin.ModelAdmin):
    # form 获取自定义表单
    form = bookForm
    
    # list_display 在管理列表页面中,显示所需字段
    list_display = ['bookname', 'price', 'author', 'coverColor', 'pubulishTime']
    
    # ordering 在管理列表页面中,设置排序所需字段
    ordering = ['bookname', 'price']
    
    # search_fields 在管理列表页面中,显示搜索框,并可针对所需字段进行查询
    search_fields = ('bookname',)
    
    # exclude 在管理列表页面中,排除不想展示的字段
    exclude = ('coverColor', 'freeze',)
    
    # fields 在编辑 or 新增页面中,需要编辑的字段
    # 第一种写法如下:(编辑具体的哪些字段, 并且每一个元组包裹的字段将会在界面上以一行展示)
    fields = [
        ('bookname','price'),
        ('author',),  # 元组形式,不要忘记了逗号
    ]
    # 第二种写法如下:(编辑所有字段)
    fields = '__all__'
    
    
    save_as = True

    def save_model(self, request, obj, form, change):
        obj.operator = str(request.user)
        obj.save()

admin.site.register(Book, BookAdmin)

(二)settings.py中的ADMIN_REORDER里添加model模块

ADMIN_REORDER = (
        {'app': 'auth', 'label': _('User Accounts Modeling -'),
         'models': ('auth.User', 'auth.Group'), },
        {'app': 'testapp', 'label': _('Test Modeling -'),
             'models': ('testapp.Test', 'testapp.Test2',), },
    )

注意:元组中若只有一个元素,结尾要加上逗号。

二、admin 导航栏的显示问题

当 admin 后台导航栏上没有显示自己添加的model,则执行如下检查:

1. admin.py里,注册该model的admin。

(1)用 admin.site.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['bid','card','name','author']
admin.site.register(Book)
(2)或用 @admin.register(Book)
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ['bid','card','name','author']

2. settings.py里,在ADMIN_REORDER中,添加该model。

3. settings.py里,在INSTALLED_APP中,添加项目app。

4. models.py里,检查fields等写法正确。

5. 检查model名称是否一致。

6. 检查是否存在写法问题(比如下方,缺少逗号)。

例如,下方的错误写法中,前者的BookType和BookPlace之间,缺少一个逗号。

# 例如,错误写法
ADMIN_REORDER = (
   {'app': 'imsapp', 'label': _('Test Modeling -'),
     'models': ('imsapp.BookType' 
                'imsapp.BookPlace'), },
)
# 改成 正确写法
ADMIN_REORDER = (
   {'app': 'imsapp', 'label': _('Test Modeling -'),
     'models': ('imsapp.BookType', 
                'imsapp.BookPlace'), },
)

三、admin 表单

(一)管理后台 admin 的表单进行空值验证

(1)直接在管理后台admin.py中验证

class BookForm(forms.ModelForm):
    def clean(self):
        if self.cleaned_data['author'].authorname== '萝卜干':
            for i in ['prize', 'publishTime']:
                if not self.cleaned_data[i]:
                  raise ValidationError('{} is required!'.format(i))
    return self.cleaned_data

# 当作者名是萝卜干时,验证价格和发布时间是否有填写,若无,则给出警告

(二)前端使用form进行空值验证

1. 在 form.py 中写表单

class BookCreateForm(forms.Form):
    bookname = forms.CharField(label='BookName:', max_length=30, required=True)
    prize = forms.CharField(label='Prize:', max_length=30, required=True)

2. 在使用 views.py 中验证

form = forms.bookFrontForm(request.POST)
if form.is_valid():
    datadict = form.cleaned_data
    print(data['prize'])
else:
    errlist = ','.join(str(i) for i in form.errors)
    print(errlist)

(三)admin表单设置输入框默认值 

class TestAdmin(admin.ModelAdmin):
    list_display = ['code', 'name']
    fields = (
        ('code',),
        ('name',),
    )
    ordering = ['code']
    search_fields = ('code',)
    save_as = True
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        form.base_fields['code'].initial = '123'  # 设置code的输入框默认值为123
        return form
    def save_model(self, request, obj, form, change):
        obj.lastuser = str(request.user.username)
        obj.save()

admin.site.register(model名.Test, TestAdmin)

四、ManyToMany

(一)基本用法

针对多对多的两张表

1. 设置 models.py 文件的 model 类

class Book(models.Model):
    author = models.ManyToManyField('Author', blank=True)
    

2. 设置 admin.py 文件的 admin 类

(1)设置 fields 属性
fields = (('employee_id'),)  # 设置展示
(2)设置 filter_horizontal 属性
filter_horizontal = ('employee_id',)  # 设置展示样式(穿梭框)

穿梭框样式如下: 

(二)limit_choices_to

limit_choices_to 是 manytomany 的條件限制。

若想过滤数据,筛选出自己想要的数据内容,则可以使用 limit_choices_to。

class Employee(models.Model):
    ee_name=models.CharField(max_length=40)
    ee_age=models.IntegerField(default=0)
def ee_func():   
    return {'ee_name__in': Employee.objects.filter(ee_age__in = ['18', '28']).values_list('ee_name', flat=True)}

class User(models.Model):
    employee1 = models.ManyToManyField(Employee, limit_choices_to= {'ee_name': 'luobogan') # 第1种写法
    employee2 = models.ManyToManyField(Employee, limit_choices_to=ee_func) # 第2种写法(若存在较为复杂的查询结构,则拉出去独立成一个方法)

(三)ManyToManyField 新增数据记录

book_qry=models.Book.objects.filter(book_name=bookname)
personbook=book_qry[0]
person_qry.book.add(personbook)

五、model 里的 __str__ 方法

作用:在后台admin设定时,若其他model引用该model1的值作为下拉式选单,则下拉选项按照__str__ 方法里的return的内容显示。

class Model1(models.Model):
    id = models.BigAutoField(primary_key=True, db_index=True)
    code = models.CharField(verbose_name=_("code"), max_length=40, db_index=True)

    def __str__(self):
        return '{}'.format(self.code)

六、Django Admin 登录不进去

(一)首先查看数据库中是否有用户

        查看库中的auth_user表,是否有用户数据。

(二)若没有用户数据,创建登录用户。

1. 正常创建用户

       打开项目终端,输入命令:

python manage.py createsuperuser

        按照提示填写管理员用户名和邮箱

        然后输入两次密码(输入过程中密码不显示)

        如下图所示:

2. 密码不合规,仍能成功创建

(三)若只是忘记密码

打开项目终端,输入命令:

python manage.py changepassword username

然后输入两次密码(输入过程中密码不显示)

其中,username是修改用户密码对应的用户名。

七、常见问题

(一)Django管理后台报错  operator does not exist: bigint = character varying 

可能的原因:PgSQL查询的时候报错,也就是在Django admin查询的栏位名有问题。

例如,若Book模型中栏位author是关联外键的,在postgre数据库中自动生成的字段名已经变成了author_id。

# model.py
class Book(models.Model):
      id = models.BigAutoField(primary_key=True, db_index=True)
      author= models.ForeignKey(Author, max_length=40, on_delete=models.CASCADE, limit_choices_to={"active": True})
    
    class Meta:
        db_table = 'book'
    
# admin.py
class BookAdmin(admin.ModelAdmin):
    # 下方需查询的author栏位
    # list_display = ['bookname', 'author', 'active']
    # 改成author_id,和数据库一致的名字
    list_display = ['bookname', 'author_id', 'active']
    list_filter = ['bookname',]
    save_as = True

admin.site.register(Book, BookAdmin)

(二)当Django管理后台报错: invalid input syntax for type bigint: "XXX"

可能的原因:postgreSQL存表数据的时候, 数据类型不匹配。

在Django admin输入的值不是int类型,但是数据库的该栏位是int类型。所以出错。

延伸:如果改动表结构的时候,将外键进行修改之后migrate,数据库的外键类型需要自己手动修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值