Django学习7 -- 添加个人应用(自定义应用页面优化)
Posted Rolei_zl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django学习7 -- 添加个人应用(自定义应用页面优化)相关的知识,希望对你有一定的参考价值。
个人应用页面调整优化,以 dr_dailyrecord 表例。
1. 页面显示自定义应用标题
* 添加templates文件夹,设置settings.py中的templates的指向,参考 Django学习6 -- 添加个人应用(admin页面配置)
* 也可以在admin.py中配置
admin.site.site_header = '页面标题'
admin.site.site_title = '页面标头'
2. 主页面显示
* 数据库设计好后,可以通过 python manage.py inspectdb 生成对应的 models,dr_dailyrecord表显示为 DrDailyrecord
* 在admin.py中注册后,admin主页面显示为Dr Dailyrecords
* 更改models.py中的类名:DrDailyrecord --> Dailyrecord,更新admin.py注册类,admin主页面显示为Dailyrecords
* 主页面中,显示所有models.py中定义并在admin.py中注册的类名,整个区域名显示为application名
说明:可使用list传入注册参数,实现多表同时注册
3. 权限
* Group: 添加group,分配group的权限,即对表的管理权限 add / change / delete / view
* Users: 添加用户,分配Groups和特殊权限,设置权限后登录用户只能管理分配权限的表
说明:这就是使用admin的原因,经过简单配置后,即可对表进行 CRUD 操作,实现数据基础管理而不用重新设计页面
3. 详细页面显示 -- Dailyrecord
> 添加页面字段从上到下依次排序显示,默认为普通输入框
* 自定义添加页面
1)显示字段类型
models.py中定义字段显示的类型,即 form(页面)中的field type(字段类型)
比如:CharField(单行输入框,可设置输入长度和default值)
DateField / DateTimeField / TimeField(日期时间输入框,可设置default值)
DecimalField / FloatField / FloatField(数字输入框,可定义小数位)
ForeignKey(外键字段下拉框显示) -- 注意: 字段名_id 构成外键名称。比如dr_dailyrecord表要命名用auth_user的username字段做为外键,在models.py中定义为user,因此dr_dailyrecord需要建字段user_id做为引用(原因不明,后面待查) -- models.ForeignKey(User,to_field ='username',on_delete=models.CASCADE)
2)使用auth_user中的用户信息,将username作为外键
from django.contrib.auth.models import User
class Dailyrecord(models.Model):
models.ForeignKey(User,to_field ='username',on_delete=models.CASCADE)
3)显示默认登录用户名
class DailyrecordAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'user':
kwargs['initial'] = request.user.username # 初始化用户 默认显示当前登录用户
if not request.user.is_superuser and db_field.name == "user":
kwargs["queryset"] = User.objects.filter(username=request.user) # Admin User表,初始化用户 非管理员只显示当前登录用户
return super(DailyrecordAdmin, self).formfield_for_choice_field(db_field, request, **kwargs)
4)字段页面部局
使用fields 和 fieldsets调整页面部局
class DailyrecordAdmin(admin.ModelAdmin):
list_display = (
'user',
'workdate',
)
fields = (('user','workdate'),)
fieldsets = (
('Basic','fields':(('user', 'workdate'),)),
> 结果列表并不能显示所有添加页面操作的数据
* 自定义显示结果列表
使用admin.ModelAdmin对字段进行管理:class DailyrecordAdmin(admin.ModelAdmin):
1)显示字段设置:list_display = (显示字段) -- 字段名为models.py中的字段定义
2)显示删选字段:list_filter = (筛选字段名)
3)显示查询条件:search_fields = (查询字段名)
class DailyrecordAdmin(admin.ModelAdmin):
list_display = (
'user',
'workdate',
)
list_filter = ('workdate','user',)
search_fields = ('user__username',) --> 使用外键,需指向主表字段名
说明:
1)django.pdf: 2.9.3, Customize the admin change list
6.5,contrib packages,Admin actions -- 配置action操作
3.4,Working with forms,Field Type / 6.15,Models
2)decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
-- 使用decimal中的最大长度不足,需要调整
3)django.core.exceptions.FieldError: Related Field got invalid lookup: icontains
-- 表外键查询,需要通过外键关链到主表字段名,即 外键字段名__主表字段名
4)别忘了注册新的admin类:admin.site.register(DailyrecordAdmin)
5)radio list
* 在models中定义字段 A,取值为choices=???
* ModelAdmin.radio_fields:radio_fields = "A": admin.VERTICAL 或 admin.HORIZONTAL
6)Chapter 6:Range fields support the standard lookups: lt, gt, lte and gte. These are not particularly helpful - they compare
the lower bounds first and then the upper bounds only if necessary. This is also the strategy used to order by a range
field. It is better to use the specific range comparison op
以上是关于Django学习7 -- 添加个人应用(自定义应用页面优化)的主要内容,如果未能解决你的问题,请参考以下文章
Django学习16 -- ModelAdmin options
Django学习16 -- ModelAdmin options
Django搭建个人博客平台7---自定义基于Bootstrap的分页组件