Study/django

very academy - django admin 시리즈 - part10

bluebamus 2022. 11. 10.

github : https://github.com/bluebamus/django-admin-very-academy

 

GitHub - bluebamus/django-admin-very-academy: django-admin-very-academy study example project

django-admin-very-academy study example project. Contribute to bluebamus/django-admin-very-academy development by creating an account on GitHub.

github.com

해당 Class는 총 3개의 파트로 나뉘어 진다.

 

Part1 : Test Project Setup

1. 새로운 프로젝트를 만들고, 이후 앱을 만든다.

    py manage.py startproject blog
    # update INSTALLED_APPS in settings.py
    py manage.py makemigrations
    py manage.py migrate

2. 앱에 대한 독립된 관리자 페이지를 만든다. 

#admin.py
    class BlogAdminArea(admin.AdminSite):
        site_header = 'Blog Database'

    blog_site = BlogAdminArea(name='BlogAdmin')

    blog_site.register(models.Post)

3. 두 명의 수퍼 사용자를 만들고 하나의 사용자 권한 중 superuser status를 Null로 만들고 저장한다.

py manage.py createsuperuser admin
py manage.py createsuperuser user

Part2 : Appling Permissions

- 공통 코드 : 기본 설정

class BlogAdminArea(admin.AdminSite):
    site_header = 'Blog Database'

class TestAdminPermissions(admin.ModelAdmin):

    def has_add_permission(self, request):
        return True

    def has_change_permission(self, request, obj=None):
        return True

    def has_delete_permission(self,request,obj=None):
        return True

    def has_view_permission(self,request,obj=None):
        return True

blog_site = BlogAdminArea(name='BlogAdmin')

blog_site.register(models.Post, TestAdminPermissions)
blog_site.register(models.Books)

1. add: ModelAdmin.has_add_permission()

def has_add_permission(self, request):
    return True

def has_add_permission(self, request):
        return False


2. change: ModelAdmin.has_change_permission()

3. delete: ModelAdmin.has_delete_permission()

4. view: ModelAdmin.has_view_permission()

 

* 나머지 부분들도 위와 동일하게 작동한다.

- 공식 사이트에서 원하는 permission 관련 항목을 검색하여 적용할 수 있다.

https://docs.djangoproject.com/en/4.1/ref/contrib/admin/

 

The Django admin site | Django documentation | Django

Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code

docs.djangoproject.com

 

Part3 : Extending Functionality Permissions

1. admin.py에서 code로 설정

   -  queryset의 obj 중 pk가 33인경우 delete permission을 제공하는 경우

def has_delete_permission(self,request,obj=None):
	if obj is None or obj.pk != 33: # obj is None or obj.title != 'asdf'
    		return True
	return False

   -  admin 페이지에서 'editors' 라는 그룹을 생선한 후, 해당 그룹에 사용자가 포함되는 경우

if request.user.groups.filter(name='editors').exists():
	return True
return False

2. admin 페이지에서 설정

3. code와 페이지 설정 사이의 실행 우선권

- admin 페이지에서 설정한 group 권한 보다, has_XXXX_permission()의 code 권한이 더 높다.

- 두 설정 중 최종적으로 code 의 permission 설정이 적용된다.

- 두 설정 방법을 사용하면, 더 디테일하고 다양한 설정 방법을 모색할 수 있다.

 

- select post to change 화면에서 delete selected posts로 post 삭제시 메시지 출력하는 방법

def has_delete_permission(self,request,obj=None):

    if obj != None and request.POST.get('action') ==  'delete_selected':
        messages.add_message(request, messages.ERROR,(
            "I really hope you are sure about this!"
        ))

    return True

- 상위 페이지에서 삭제하고자 하는 post 선택 후 go를 누르게 되면

- 상위 페이지와 같이 상단에 설정한 메시지가 출력된다.

댓글