Finally Django has implemented readonly fields in Admin interface. It’s a new feature in 1.2 which is in alpha version at this moment, but will be released soon.

The feature is really simple and is already documented so I won’t explain how it works. But there is one implementation detail not documented that gives much more power to this feature. If you check the admin sources, you’ll find a method called get_readonly_fields() in django/contrib/admin/options.py, by default it just returns self.readonly_fields, which is the normal usage, but since you receive the request object as a parameter you can enable or not some fields depending on the logged in user.

Here is an example where a slug field can just be edited by superusers:

class FooModelAdmin(admin.ModelAdmin):
    ...
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return ()
        return ('slug',)

There are lot’s of interesting new features in Django 1.2, I’m looking forward for it!