2.장고 admin을 통한 데이터 관리

1 분 소요

장고 admin을 통한 데이터 관리

django.contrib.admin 앱을 통해 제공

  • default 경로 : /admin/ -> 실제 서비스에서는 알 수 없게 다른 주소로 변경 권장
  • django-admin-honepot 앱을 통해 가짜, admin 페이지 노출
# /프로젝트/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls), # URL Reverse (주소를 변경해도 알아서 찾아가는 기능)
    path('blog1/', include('blog1.urls')),
]
  • 장고는 기본적인 CRUD를 지원하는 웹UI를 제공한다. 이를 admin이라고 하며 모델 등록을 통해 사용 가능
  • CMS로 활용할 정도는 아니고 서비스 초기에 관리도구로 제격
  • 관리도구를 만들 시간을 줄이고 End-User 서비스에 집중
  • 내부적으로 Django Form을 적극적으로 사용

모델 클래스를 admin에 등록하기

admin에 등록은 1번만 가능하며 이미 등록된 register에 대해서는 unregister를 하고 사용해야함

# 앱/admin.py
# Item은 모델 클래스명
from django.contrib import admin
from .models import Item

# 등록법 1
admin.site.register(Item) # 기본 ModelAdmin으로 동작

# 등록법 2
class ItemAdmin(admin.ModelAdmin):
    pass

admin.site.register(Item, ItemAdmin) # 지정한 ModelAdmin으로 동작

# 등록법 3 
@admin.register(Item)
class ItemAdmin(admin.ModelAdmin):
    pass

모델 클래스에 __str__을 구현

  • Admin 클래스에서 list_display를 지정하지 않으면 기본적으로 class.__str__()의 리턴값을 출력하기 때문에 __str__ 설정을 통해 정의
# 앱/models.py
from django.db import models

class Post(models.Model):
    message = models.TextField()
    is_publish = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        #return f'Custom Post object ({self.id})'
        return self.message
    
    # 인자 없는 속성 지정 가능 (admin단 에서도 구현 가능하나 자주 사용할 경우 model단에서 활용)
    # def message_length(self):
    #     return len(self.message)
    # message_length.short_description = "메세지 글자수"

admin의 다양한 속성 정의

  • list_display : 모델 리스트에서 출력할 cloumn 지정
  • list_display_links : list_display에서 링크를 지정하는 속성 리스트
  • search_field : admin내 검색UI를 통해, DB를 통한 where 쿼리 대상 필드 리스트 (검색창)
  • list_filter : 지정 필드 값으로 필터링 옵션 제공 (오른쪽 사이드 바)
from django.contrib import admin
from .model import Post

@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['id', 'message', 'message_length', 'created_at', 'updated_at']
    list_display_links = ['message']
    list_filter = ['created_at']
    search_fiedls = ['message']
    
    # admin, model에서 어느 곳에서나 구현 가능
    def message_length(self):
        return len(self.message)
    message_length.short_description = "메세지 글자수"

django 모델 속성

댓글남기기