인프런 커뮤니티 질문&답변
15:20쪽이 이해가되지 않아 문의드립니다.
작성
·
186
1
@admin.register(Post) #wrapping
class PostAdmin(admin.ModelAdmin):
list_display =['pk', 'message', 'message_length' ,'created_at', 'updated_at'] #모델에서 정의된 필드들 함수들을 넣을수 있다. admin 페이지에서 확인가능
list_display_links = ['message'] #message를 통해 해당 Post로 들어갈수 있게한다(여러개 설정가능)
def message_length(self, post):
return len(post.message)
여기서 message_length가 post를 받는데
앞글자가 대문자가아닌 소문자인데 어떤식으로 인자를 받는건가요?
답변 1
0
이진석
지식공유자
안녕하세요.
ModelAdmin.list_display에 지정된 문자열이 해당 ModelAdmin에 구현된 멤버함수의 이름일 경우
list 페이지가 보여질 때, 해당 멤버함수가 자동호출되며 **첫번째 인자**로 모델인스턴스를 넘겨줍니다.
함수의 첫번째 인자로 넘겨지기 때문에 인자의 이름은 달라도 상관없습니다. 인자의 위치, 즉 인덱스(index)만 맞으면 됩니다. 이를 파이썬 문법에서는 위치 인자(Positional Arguments) 라고 합니다.
아래 코드에서 mysum 함수 호출 시에 x에는 1이 대입되고, y에는 2가 대입됩니다. 함수 호출 시에 값1이 첫번째에 있기에 mysum 함수 인자의 첫번째 인자인 x에 대입이 되는 것이죠.
클래스에서는 다음과 같습니다. 값 "Django" 는 첫번째 인자이기에 hello 멤버함수의 첫번째 인자인 name에 대입이 됩니다. 인자 name은 이름이 달라도 위치만 같으면 위치인자 요건에 맞기에 값을 받을 수 있습니다.
그리고 post 이름이 Post 클래스를 뜻하는 것이 아니라, 단순히 Post 모델에 대한 ModelAdmin이기에 모델인스턴스도 Post 모델에 대한 인스턴스가 지정될 것이기에, 소문자로 post로 지정한 것입니다. 참고로 파이썬에서는 변수명은 snake_case로 짓는 코드스타일 관례가 있습니다.
화이팅입니다. :-)






감사합니다. 바로 이해되었습니다.