1)
from django.contrib import admin
from django.urls import path, include
...
urlpatterns = [
path('admin/', admin.site.urls),
"admin/로 시작하는 주소 요청에 대해서는 django.contrib에 있는 admin 앱에서 처리하겠다."
2)
instagram 앱에서 만든 모델을 admin에서 사용하기 위해서는 admin.py에 따로 등록을 해줘야한다.
3)
class Post(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
auto_now_add는 Post 모델을 통해서 record가 db에 insert될 때 자동으로 입력되는 명령이라서 TextField처럼 표시되지 않는다.
4)
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display= ['id', 'message', 'created_at', 'updated_at']
".models에서 import한 Post란 class를 감싸서 기능을 바꿀래."
"PostAdmin이란 class를 만드는데, 위에서 import한 admin에서의 ModelAdmin을 상속 받겠다."
"모델의 리스트에 나타날 컬럼을 정해줄래."
5)
def __str__(self):
return self.message
".models의 Post에서 기존 Post object () 형태로 제공되는 형태를 TextField에 입력된 값으로 대체할래."
6)
Input
class Post(models.Model):
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.message
__str__.short_description = "이것도 가능"
def message_length(self):
return len(self.message)
message_length.short_description = "메세지 글자 수"
Output
__str__은 매직 메소드여서 그런지 메소드.short_description이 적용되지 않았다.
7)
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['id', 'message', 'message_length', 'created_at', 'updated_at']
list_display_links = ['message']
def message_length(self, post):
return len(post.message)
자주 쓰는 경우 위와 같이 .models에서 정의해 주겠지만, admin.py에서 장식자 하에 정의해줄 수도 있다.
8)
Input
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['id', 'message', 'message_length', 'created_at', 'updated_at']
list_display_links = ['message']
search_fields = ['message']
Output
search_fields를 구현 및 사용할 때, q라는 이름의 query string으로 '세번'이 전달됨을 볼 수 있다.
더 자세한 내부 시퀀스는 "instagram 앱의 .models 파일의 Post 클래스를 가져와서, 그 클래스로 생성한 모든 객체들들 사이에서, 필터로 '세번'이라는 키워드를 가진 쿼리셋만 걸러줘, 그리고 그 쿼리셋을 저장(qs)한 뒤에, 그 쿼리셋의 쿼리 부분(qs.query)만 프린트해 줘." 정도로 이해할 수 있다.