티스토리 뷰

Python/* Django

6. Django Admin

포꾼 2017. 12. 12. 14:53

Django Admin

- staff/superuser 계정에 한해 접근 가능

- 모델 클래스만 등록하면, 조회/추가/수정/삭제 웹 인터페이스가 제공

- 장고가 제공하는 기본 앱에서 확인 가능 함

 INSTALLED_APPS = [

    'django.contrib.admin',

]

ex) 맛집 등록서비스 관리자가 어드민 페이지를 통해 기본 포맷과 인터페이스를 지정하고, 이후 사용자들에게 사용하도록 만들수 있다.


# Model Admin 등록법 1

from django.contrib import admin

from blog.models import Post


admin.site.register(Post) # 기본 ModelAdmin으로 등록


# Model Admin 등록법 2

- admin.ModelAdmin을 상속받아 어드민페이지내 커스터마이징이 가능함

from django.contrib import admin

from blog.models import Post


class PostAdmin(admin.ModelAdmin):

       list_display = ['id', 'title', 'content']

admin.site.register(Post, PostAdmin) # 참고: 같은 모델 중복 등록은 불가


#(선호) Model Admin 등록법 3 : 장식자 형태로 지원  

from django.contrib import admin

from blog.models import Post


@admin.register(Post)

class PostAdmin(admin.ModelAdmin):

       list_display = ['id', 'title', 'content']  # Post 어드민페이지에 보여줄 필드명 지정

<id, title, content>


ModelAdmin 옵션

• list_display : Admin 목록에 보여질 필드 목록.

• list_display_links  : 목록 내에서 링크로 지정할 필드 목록.

• 이를 지정하지 않으면, 첫번째 필드에만 링크가 적용

• list_editable : 목록 상에서 수정할 필드 목록

• list_per_page (디폴트 : 100) : 페이지 별로 보여질 최대 갯수

• list_filter : 필터 옵션을 제공할 필드 목록

• actions : 목록에서 수행할 action 목록

• fields : add/change 폼에 노출할 필드 목록

• fieldsets : add/change 폼에 노출할 필드 목록 (fieldset)

• formfield_overrides : 특정 Form Field 에 대한 속성 재정의

• form : 디폴트로 모델 클래스에 대한 Form Class 지정 


list_dispaly 옵션

- 모델 인스턴스 필드명/속성명/함수명 뿐만 아니라, ModelAdmin 내 멤버 함수도 지정 가능

- 외래키를 지정한다면, 관련 object의 __str__() 값이 노출

- ManyToManyField 미지원

from django.contrib import admin

from django.utils.safestring import mark_safe

from .models import Post


# admin.ModelAdmin


@admin.register(Post)

class PostAdmin(admin.ModelAdmin):

    list_display = ['id', 'title', 'content', 'content_size']

    actions = ['make_draft','make_withdrawn','make_published',]


    def content_size(self, post):

        return mark_safe('<strong>{}글자</strong>'.format(len(post.content)))

    content_size.short_description = '글자수'



Tag Escape

• Django 에서는 파이썬 코드/변수를 통해 보여지는 Html Tag 에 대해 Auto Escape 를 수행

• a/img/script 태그 등으로 인한 허용치않은 코드 실행 방지

  ex) 악성 스크립트 실행

• 특징 문자열에 한해, 이를 해제하기 위해 autoescape off template tag를 적용하거나, 문자열에 format_


Admin Actions

대개 선택된 Model Instance 들에 대해 Bulk Update 용도 구현

1. ModelAdmin 클래스내 멤버함수로 action 함수를 구현

• 멤버함수.short_description 을 통해, action 설명 추가

2. ModelAdmin actions 내에 등록


모델 status 컬럼 추가 및 마이그레이션

# blog/models.py


STATUS_CHOICES = (

('d', 'Draft'),

('p', 'Published'),

('w', 'Withdrawn'),

)

class Post(models.Model):

status = models.CharField(max_length=1, choices=STATUS_CHOICES)


> python3 manage.py makemigrations blog

> python3 manage.py migrate blog



# blog/admin.py admin action 추가


from django.contrib import admin

from django.utils.safestring import mark_safe

from .models import Post


# admin.ModelAdmin


@admin.register(Post)

class PostAdmin(admin.ModelAdmin):

    list_display = ['id', 'user', 'title','created_at','status','content_size']

    actions = ['make_draft','make_withdrawn','make_published',]


    def content_size(self, post):

        return mark_safe('<strong>{}글자</strong>'.format(len(post.content)))

    content_size.short_description = '글자수'

    #content_size.allow_tags = True ## html 태그사용 ,조만간 사라짐 


    def make_draft(self, request, queryset):

        update_count = queryset.update(status='d') # QuerySEt 사용

        self.message_user(request, '{}건의 포스팅을 draft상태로 변경'.format(update_count)) # django message framework 사용

    make_draft.short_description = '지정 포스팅을 draft 상태로 변경 합니다.'



    def make_published(self, request, queryset):

        update_count = queryset.update(status='p') # QuerySEt 사용

        self.message_user(request, '{}건의 포스팅을 Published상태로 변경'.format(update_count)) # django message framework 사용

    make_published.short_description = '지정 포스팅을 Published 상태로 변경 합니다.'


    def make_withdrawn(self, request, queryset):

        update_count = queryset.update(status='w') # QuerySEt 사용

        self.message_user(request, '{}건의 포스팅을 withdrawn상태로 변경'.format(update_count)) # django message framework 사용

    make_withdrawn.short_description = '지정 포스팅을 withdrawn 상태로 변경 합니다.'




"""본 내용은 AskDjango VOD, "장고 차근차근 시작하기" 강의내용을 참고하여 작성했습니다.(https://nomade.kr/)"""

반응형

'Python > * Django' 카테고리의 다른 글

8. Http Status Code 404  (0) 2017.12.13
7. 모델을 통한 데이터 CRUD  (0) 2017.12.12
5. Migration  (0) 2017.12.12
4. Django Model과 Model Fields  (0) 2017.12.12
3. View Overview  (0) 2017.12.12
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함