WIL. drf팀프로젝트(7) media 파일 삭제, js import위치
[오늘 한일]
- 프로젝트 진행
[오늘 배운점]
<이미지 파일삭제 또다른 방법>
지난번 프로젝트에서 이미지 파일 삭제하는 방법을 배웠었다.
오늘 파일 삭제를 동작하는 새로운 방법을 배우게 되었다.
class ProfileEditSerializer(serializers.ModelSerializer):
(중략)
def update(self, instance, validated_data):
if validated_data.get("image", None):
instance.image.delete(save=False)
return super().update(instance, validated_data)
시리얼라이저에 작성한 코드 내용이다.
수정의 경우이며, 이미지의 유무를 검사한다.
instance.image.delete가 삭제 동작 코드이다.
여기서 instance는 넘겨받아온 데이터 모델 인스턴스다.
해당 모델의 image요소. 즉 image필드를 지칭한다음 delete메소드를 실행한다.
보통 delete메소드는 모델 인스턴스에 작성하는데,
이렇게 필드에 작성할수 있고, 이미지 파일경로가 저장된 필드인 경우에는,
delete가 사진 파일까지 삭제시킨다.
여기서 delete()메소드는 모델의 메소드가 아닌 필드의 메소드이다.
이미지 파일 필드의 delete메소드는
from django.db.models.fields.files import FileField, ImageField
여기 모듈에서 참고할 수 있다.
save=False옵션을 주면 삭제 처리후에 저장을 한번 하는 걸 막을 수 있다.
상황에 따라 조정하여 사용하면 될거같다.
<js파일 임포트 위치>
html파일에서 js파일 임포트는 보통 헤드 안에 작성하는걸 보게된다.
그런데 또 인터넷에선 </body>태그 위에 작성하라고 한다.
내가 작성한 프론트에서 네비게이션 바가 가끔 작성이 안되는 문제가 발생했고 원인을 알아봤다.
js파일에서 html본문에 특정 태그나 내용을 가져올때,
js파일 import가 head에 있는 경우,
두 파일의 처리속도 차이로 본문 요소를 못 가져 올 가능성이 있다.
해결 방법은 두가지 였다.
바디 끝부분으로 코드위치를 옮기거나,
js파일에 window.onload를 작성해서 함수를 담아주는 것이다.
그럴 경우 화면이 다 작성된다음 함수를 실행하니 문제를 막을수 있다.
하지만 window.onload는 import해오는 js파일중 하나에만 있어야 한다는 문제가 있다.
js를 여러개 import할 경우 그중 한파일에서만 사용할수 있다.
그래서 전자의 방법으로 해결할수 있었다.
부트스트랩 사이트의 예시도 그렇고, 보통 body끝에 적는게 좋다고 한다.
그런데 한국에선 왜그런지 head안에 쓰는 방법이 퍼졌다고 한다.
결국, 작성스타일 차이지만, 아까 말한 문제가 있으니 전자의 방법이 더 스마트 해보인다.