very academy - django admin 시리즈 - part10
github : https://github.com/bluebamus/django-admin-very-academy
해당 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/
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를 누르게 되면
- 상위 페이지와 같이 상단에 설정한 메시지가 출력된다.
'Study > django' 카테고리의 다른 글
django 2022년 최신 정보, 이슈 정리 (0) | 2022.11.21 |
---|---|
django 에러 페이지 만들기 (0) | 2022.11.16 |
very academy - django admin 시리즈 - Total (0) | 2022.11.09 |
very academy - django admin 시리즈 - part2 (0) | 2022.11.04 |
Django - 커스텀 Table을 이용한 관리 권한 구현 (0) | 2022.09.27 |
댓글