目录
(二)settings.py中的ADMIN_REORDER里添加model模块
(1)用 admin.site.register(Book)
2. settings.py里,在ADMIN_REORDER中,添加该model。
3. settings.py里,在INSTALLED_APP中,添加项目app。
(一)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,数据库的外键类型需要自己手动修改。