如何使字段除超级用户以外在django admin中只读?

时间:2018-09-15 22:49:15

标签: django django-models django-admin

我定义了以下模型:

class PRegistration(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    create_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    teamName = models.CharField(max_length=144)
    city = models.CharField(max_length=144)

如何使除超级用户外的所有职员帐户的所有这些字段在管理员页面中均为只读?我想这样做而不需要一一指定字段,以便我可以在多个地方重复使用代码。

2 个答案:

答案 0 :(得分:0)

在您在admin.py中创建的ModelAdmin子类中添加以下功能。 get_read_only函数返回一个列表或元组,该列表或元组告诉将要设置为只读的字段。在以下代码中,非超级用户人员帐户将所有字段视为只读,而超级用户将能够编辑所有这些字段。

def get_readonly_fields(self, request, obj=None):
    if request.user.is_staff:
        if request.user.is_superuser:
            return []
        else:
            return [f.name for f in self.model._meta.fields]

特别感谢:this question and its answers

答案 1 :(得分:0)

如果您的model.py包含

class PRegistration(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    create_date = models.DateTimeField(auto_now=False, auto_now_add=True)
    teamName = models.CharField(max_length=144)
    city = models.CharField(max_length=144)

如果您要使字段 user,teamName 对于除超级用户以外的其他人员为只读。 将此代码添加到同一应用的admin.py上。

@admin.register(PRegistration)
class PRegistrationAdmin(admin.ModelAdmin):
    list_display = ['user']
    search_fields = ['user']
    readonly_fields = ['user', 'teamName']

    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return []
        return self.readonly_fields