ModelAdmin: set readonly_fields based on a condition


Does someone know if it is possible to define the readonly_fields of a ModelAdmin based on a condition ? My objective is to make some fields readonly on the admin change view if a field (validation) of the instance is set to True


class NCF(models.Model):
    name = models.CharField(max_length=255)
    description = models.CharField(max_length=255)
    validation = models.BooleanField(default=False)

How can I access the model instance to make a condition ?
Idea of what I would like to achieve in the Admin

class NCFAdmin(admin.ModelAdmin):
     obj = *model_instance*
     if obj.validation:
        readonly_fields = ["name", "description"]

Thanks for your help

There’s the get_readonly_fields function you can override that will give you the option to dynamically change the readonly_fields.


Thank you very much Tim.

For anyone interested here is how I did.

Note that do not declare the readonly_fileds and in the get_readonly_fields() I simply retrun the list of fields I want to be readonly.

In this exeample I want to change the readonly fields when the instance already exists and his field inspector_validation has been set to True…

class NCFAdmin(admin.ModelAdmin):
    list_display = ['_ncf_number', '_statement_link', 'date']
    change_form_template = 'admin/ncfs/change_form_with_custom_cancel_validate.html'
    raw_id_fields = ['certificate']

    def get_readonly_fields(self, request, obj=None):
        if obj and obj.inspector_validation:
            return ["certificate", "report_number", 'inspector', 'inspector_validation', "parent",
                    "child", 'severity', 'status', 'date']
        return ["report_number", 'inspector_validation', "parent", "child", 'inspector', 'status']


Hope this help someone