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

  • 이전에 설명한 내용이다.
  • admin/으로 접속했을 때 내가 등록한 장고앱을 보이게 하는 법이다.
  • 장고앱의 admin.py 파일에 접근해 다음과 같은 내용을 붙여넣기 해주었었다.
from django.contrib import admi
 
# 추가
from .models import Post

# Register your models here.
# 추가
admin.site.register(Post)
  • 이 내용 외 다음과 같이 커스텀 해줄 수도 있다.
from django.contrib import admi
 
# 추가
from .models import Post

# Register your models here.
# 추가
 class PostAdmin(admin.ModelAdmin):
  pass

admin.site.register(Post,PostAdmin)
  • 또 다른 방법으로는
from django.contrib import admin
from .models import Post

# Register your models here.
@admin.register(Post# Wraping
class PostAdmin(admin.ModelAdmin):
  pass

이렇게 해줄 수도 있다. 이를 장식자 방법이라고 한다.

 

이렇게 작성 후 admin/ 으로 가서 방금 생성한 장고앱에 게시물을 세개쯤 등록해 보았다.

제목을 보면 Post object이다. 이것을 수정해보자

장고앱의 models.py 파로 간다.

from django.db import models

# Create your models here.
class Post(models.Model):
  message = models.TextField()
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now=True)

현재는 이렇게 작성되어 있다. 다음과 같이 함수 아래에 추가해준다

from django.db import models

# Create your models here.
class Post(models.Model):
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    # 추가
    # Java의 toStirng
    def __str__(self):
        return f"Custom title ({self.id})"

다시 admin/의 장고앱 부분을 확인해본다

설정한대로 적용된 것을 볼 수 있다.

작성한 메세지를 반환하고싶으면

리턴 값에 self.message 를 넣으면 된다.(message : 내가 위에서 설정해준 모델의 속성명)

위의 def __str__(self): 함수는 자바의 toString()과 유사하다고 보면 된다.

 

list_display 속성 정의

     - 모델 리스트에 출력할 컬럼 지정

 

  • 다시 장고앱의 admin.py 파일로 간다.
  • pass를 지우고 list_display에 관련된 정보를 넣는다.
from django.contrib import admin
from .models import Post

# Register your models here.
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
    list_display = ['pk', 'message', 'created_at', 'updated_at']
  • primary key 는 속성명이 무엇이든 pk라는 alias로 사용가능하다.

그러면 다음곽 같이 /admin에서 확인 가능하다

  • 잘 보면 pk에 링크가 잡혀있는데 이것을 message로 옮겨보겠다.
    • list_display 아래 list_display_links = ['message'] 추가

메세지에 링크가 잡혀있다

 

  • Model 에는 다음과 같이 속성을 정의 할 수도 있지만  message = models.TextField() 
  • 함수로 정의도 가능하다.
class Post(models.Model):
    message = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    # 추가
    # Java의 toStirng
    def __str__(self):
        # return f"Custom title ({self.id})"
        return self.message
   
    def message_length(self): <- 이부분!
      return len(self.message)
    message_length.short_description = "메세지 글자 수" <- 칼럼테이블에서 보여주고 싶은 글
  • 여기에서 message_length 또한 속성이 된다.
  • 이 또한 /admin list_display에 추가해보자
list_display = ['pk', 'message', 'message_length', 'created_at', 'updated_at']

 

  • 위 같이 잘 설정되었다.
  • message_length를 medel.py가 아닌 admin.py에서 구현할 수도 있다. (admin에서만 확인하고 싶은 경우)

 

admin에서 모델 속성 구현하기

  • 장고앱의 admin.py로 들어간다.
  • list_display 정의 아래에 아래 함수 추가해주고 list_display 안에 test_column을 넣어준다.
    def test_column(self, post):
        return f'{len(post.message)} 글자'

test_column이 보이는 것을 확인할 수 있다.

 

 Search_fields 속성 정의

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

 

cmd창에서 python 명령으로 query를 실행해본다.

( 내 프로젝트까지의 경로 (예: C:/bora/dev/myproject)> python manage.py shell
Python 3.9.7 (tags/v3.9.7:1016ef3, Aug 30 2021, 20:19:38) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from instagram.models import Post
>>> Post.objects.all()
<QuerySet [<Post: 첫번째 메세지>, <Post: 두번째 메세지>, <Post: 세 번째 메세지>]>
>>> Post.objects.all().filter(message__icontains='첫')
<QuerySet [<Post: 첫번째 메세지>]>
>>> qs = Post.objects.all().filter(message__icontains='첫') 
>>> print(qs.query)
SELECT "instagram_post"."id", "instagram_post"."message", "instagram_post"."created_at", "instagram_post"."updated_at" FROM "instagram_post" WHERE "instagram_post"."message" LIKE %첫% ESCAPE '\'

 

  • list_display 와 같은 indent에 다음 추가
    search_fields = ['message']
  • admin/을 확인하면 검색바가 생성되었다. 이곳에 검색하면 message안에 있는 글자를 찾아 검색한다.

list_filter 속성 정의

       - 지정 필드값으로 필터링 옵션 제공

 

  • list_display 와 같은 indent에 다음 추가
    list_filter = ['created_at']
  • 추가하고 보면 admin/에 무언가 추가된 것을 확인할 수 있다.

확대

 

add

새로운 컬럼을 함수가 아닌  message = models.TextField() 이런식으로 구현하는 경우

  • DB에 적용하기 위해서 반드시 python manage.py migrate 장고앱이름 을 해주어야 한다.
  •  python manage.py makemigrations 장고앱이름 명령어를 치면 장고앱 폴더 아래의 migration 폴더 안에 000N_post_속성이름.py 이런식으로 파일이 하나 더 생성된다.
  • python manage.py showmigrations 장고앱이름 명령어를 치면 해당 장고앱의 마이그레이션 적용내역을 볼 수 있다.