12

In Django-admin, Is it possible to make feature so that admin can create/edit/delete certain permission through django-admin while the server is running?

In django-admin I want the permission can be listed, with edit create and delete feature

Using permission in Meta subclass of models class will create custom permission through migrate script. taken from https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-permissions

class Task(models.Model):
...
    class Meta:
        permissions = (
            ("view_task", "Can see available tasks"),
            ("change_task_status", "Can change the status of tasks"),
            ("close_task", "Can remove a task by setting its status as closed"),
        )

This will insert values on auth_permission (and django_content_type) But that requires database migrations, which means unlikely be done by user (Admin) but by the developer instead. And I believe it is necessary for application to be able to manage permission, creating, editing, deleting while the server is running.

So what is the best practice to make this functionality with Django? Should I keep using migrate & create them all in each model and to reload server everytime we implement new permission or feature in general? thankyou

2 Answers 2

26

You can register the Permission model to admin view:

from django.contrib.auth.models import Permission
from django.contrib import admin
admin.site.register(Permission)

The code can be anywhere where it gets executed, but admin.py of your application could be an intuitive place to stick it in. After this, you will be able to view, edit and remove the permissions.

Sign up to request clarification or add additional context in comments.

Comments

7

You also need to select_related because it will result in a bunch of SQL queries

from django.contrib import admin
from django.contrib.auth.models import Permission


@admin.register(Permission)
class PermissionAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super().get_queryset(request)
        return qs.select_related('content_type')

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.