현재는 user가 2명밖에 없지만 만약 수천명이 된다면 이렇게 해서 확인하기가 어려워진다.
때문에 이런 ForeignKey나 ManyToMany로 연결된 필드들을 pk로 관리할 수 있도록 하자.
raw_id_fields
rooms - admin.py - RoomAdmin
raw_id_fields = ("host",)
돋보기 클릭하면 user 검색하는 팝업도 뜸
admin 안에 또다른 admin을 넣기. 사진을 Photo에서만 보는게 아니라 User에 들어가서도 볼 수 있도록 한다. 여기서는 InlineModelAdmin 이란걸 쓰도록 한다.
rooms - admin.py
class PhotoInline(admin.TabularInline):
model = models.Photo
class RoomAdmin(admin.ModelAdmin):
'''
inlines = (PhotoInline,)
TabularInline말고 StackedInline으로 해보자. 그냥 보여주는 방식의 차이인듯.
class PhotoInline(admin.StackedInline):
model = models.Photo
둘 중 어느것을 쓸 것인지는 선호도 차이이고, 이제 우리는 Room 화면에서 사진들을 볼 수 있게 되었다! 이게 다 ForeignKey 덕분이다.
주소를 seoul로 입력해도 Seoul로 저장되게 하려면 사용자가 입력한 내용을 가로채서 수정할 수 있어야 한다.
rooms - models.py - Room
def save(self, *args, **kwargs):
print(self.city)
super().save(*args, **kwargs)
def save(self, *args, **kwargs):
self.city = "potato"
super().save(*args, **kwargs)
이렇게 할 경우 CITY를 뭘로 적어도 potato가 자동으로 저장된다.
RoomAdmin에 save_model 메서드를 적용해보자
rooms - admin.py - RoomAdmin
def save_model(self, request, obj, form, change):
print("obj : ", obj, "\nchange : ", change, "\nform : ", form)
super().save_model(request, obj, form, change)
Room 페이지 하나를 들어가서 수정을 하고서 저장하고 콘솔을 보면 form이 엄청나게 길게 출력된 것을 볼 수 있다.
obj는 Room 클라스, change는 변경 유무. 여튼 이거는 연습용이었으므로 삭제. models.py에 있는 save는 입력된 정보를 대문자로 바꿔주는 메소드로 작성한다.
rooms - models.py - Room
def save(self, *args, **kwargs):
self.city = str.capitalize(self.city)
super().save(*args, **kwargs)
도시 이름 소문자로 저장
하지만 대문자로 저장됐지롱!