(Django) Admin

duo2208·2021년 8월 31일
0

Django

목록 보기
3/23
post-thumbnail
post-custom-banner
다른 프레임워크와 비교하여 장고는 최소한의 작업만으로 어드민 인터페이스를 만들 수 있다는 장점이 있습니다. 그러한 어드민에 대해 알아봅니다.

Model 클래스 admin에 등록하기


등록법1 : 기본 ModelAdmin

from django.contrib import admin
from .models import Post

admin.site.register(Post) 

등록법2 : 지정한 ModelAdmin
admin.ModelAdmin 상속을 통한 커스텀마이징이 가능하다.

from django.contrib import admin
from .models import Post

class PostAdmin(admin.ModelAdmin):
	pass    
admin.site.register(Post, PostAdmin)

💡 등록법3 : The register decorator
가장 많이 선호되는 방식이다.

from django.contrib import admin
from .models import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
	pass

⚡ 일반적으로 장고의 어드민 기능은 깊은 수준까지 커스텀마이징할 피요가 없다. 장고의 어드민 기능을 커스텀마이징하기보다는 목적에 부합하는 뷰나 폼을 아예 새로 만드는 것이 일의 수고를 덜기도 한다.

🚀 (Django) Model Admin 객체

ModelAdmin 옵션


  • list_display : 모델 리스트에 출력할 컬럼 지정. list_display 를 설정하지 않으면 __str__()에 각 개체의 표현을 표시하는 단일 열이 표시된다.

  • list_display_links : list_display 에 지정된 이름 중에 detail 링크를 걸 속성 리스트

  • list_editable : 편집을 허용할 모델의 필드를 설정한다. 즉 인스턴스로 이동하지 않고 바로 수정가능하게 해줌.

  • list_filter : 지정 필드값으로 필터링 옵션 제공

  • search_fileds : admin내 검색UI를 통해, DB를 통한 where 쿼리 대상 필드 리스트


+ (TIP) 객체의 이름 보여주기

◽ 모든 장고 모델에 대해 항상 객체를 스트링으로 표현해주는 __str__() 메서드를 구현하자. __str__() 의 결과가 장고 모델의 인스턴스 이름을 대표할 수 있도록 정한다. 어드민 리스트 페이지에서 객체에 대한 문자열 표현이 매끄럽게 처리된다.
◽ 어드민 리스트의 항목들이 해당 객체의 문자열 값(이름)을 보여주는 것이 아니라면 list_display를 이용하자.

from django.db import models

class IceCreamBar(models.Model):
	name = models.CharField(max_length=100)
	filling = models.CharField(max_length=100)
    
	def __str__(self):
		return self.name

+ (TIP) 다중 사용자가 이용하는 환경에서 list_editable 이용은 피하자

list_editable fields don't support 'save' in multiuser environment

Django에서의 레코드는 레코드의 프라이머리 키가 아니라 레코드의 순서로 식별되기 때문에 다중 사용자가 이용하는 환경에서 list_editable을 이용하면 문제가 발생할 수 있다.

다중 사용자가 이용하는 환경을 생각해보자. A라는 관리자가 데이터를 삽입하는 동안 B가 admin 페이지에서 list_editable 항목이 있는 페이지를 열면 필드 값이 모델의 다른 인스턴스 값으로 업데이트될 수 있다.

🚀 (Django) Model Admin 옵션

Admin 실습


models.py

from django.conf import settings
from django.db import models

class POST(models.Model):
    message = models.TextField(blank=True)
    # null=True 를 사용하고 싶다면, NullBooleanField를 이용한다
    is_public = models.BooleanField(default=False, verbose_name='공개여부')   
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # __str__() : 객체가 가지고 있는 정보나 값들을 문자열로 만들어 리턴하는 toString() 메서드와 유사하다.
    def __str__(self):
        # return f"Custom Post object ({self.id})"
        return self.message

admin.py

from django.contrib import admin
from .models import POST

@admin.register(POST)   # Wrapping,  Decorator
class POSTAdmin(admin.ModelAdmin):
    list_display = ['id', 'message', 'message_length', 'is_public', 'created_at', 'updated_at']
    list_display_links = ['message']
    list_filter = ['created_at', 'is_public']
    search_fields = ['message']

    # 명시적으로 객체가 넘어와야함
    def message_length(self, post):
        return len(post.message)
    message_length.short_description = "메시지 글자 수"

결과

post-custom-banner

0개의 댓글