django-xadmin根据当前登录用户动态设置表单字段默认值

相信你一定会设置一个普通字段的默认值:

class Offer(models.Model):
    salary = models.CharField(max_length=64, blank=True, default='6000', verbose_name='薪资待遇')

相信你还能动态设置外键字段的默认值:

class Interview(models.Model):
    department = models.ForeignKey('departments.Department', related_name='interview',
                                   on_delete=models.PROTECT, default=get_department, verbose_name='面试部门')

def get_department():
    department = Department.objects.get(name='管理部')
    return department.id

但是以上都是从数据库模型层面修改,数据层面的修改有个缺点,就是针对所有用户都设置成同一个默认值

如果我想根据当前登录用户的身份来动态设置默认值呢?

要解决这个问题就不能从数据库层面来设置了,而要在adminx.py文件中去设置。

class Interview(models.Model):
    hruser = models.ForeignKey(HrUser, related_name='interview', on_delete=models.PROTECT, verbose_name='姓名')
    department = models.ForeignKey('departments.Department', related_name='interview', on_delete=models.PROTECT, verbose_name='面试部门')
    creator = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='creator', on_delete=models.PROTECT, verbose_name='创建者')

@register(Interview)
class InterviewAdmin(InterviewSrv):
    list_display = ('hruser', 'status', 'department', 'creator', ...)
    list_per_page = 50
    ...
    # 需要重写instance_forms方法,此方法作用是生成表单实例
    def instance_forms(self):
        super().instance_forms()
        # 判断是否为新建操作,新建操作才会设置creator的默认值
        if not self.org_obj:
            self.form_obj.initial['creator'] = self.request.user.id

最终效果:

创建者会根据当前登录用户自动填入

django-xadmin根据当前登录用户动态设置表单字段默认值_第1张图片

你可能感兴趣的:(Django)