모델 클래스를 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)} 글자'
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 장고앱이름 명령어를 치면 해당 장고앱의 마이그레이션 적용내역을 볼 수 있다.