zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Django学习7 -- 添加个人应用(自定义应用页面优化)

django应用学习 优化 -- 自定义 添加 页面
2023-09-14 09:10:54 时间

  个人应用页面调整优化,以 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