내일배움캠프 22일차

2023년 04월 14일 by barryjung

    내일배움캠프 22일차 목차

[오늘 한일]

  • 팀프로젝트 진행

 

[오늘 배운점]

<사진 데이터 비우기>

장고에서 사진을 업로드하는건 어제 완성했다.

 

이 사진 업로드하기 기본 형태는 사진을 바꾸는 것도 문제없이 동작한다.

그러니까, 내 사진을 업로드한 상태에서 재차 또 업로드를 하면 사진이 잘 변경된다.

 

그리고 빈폼으로, 재차 업로드를 하며 사진을 선택하지 않으면

blank=True 옵션이 있기때문에 빈칸으로 입력이 허용되고,

이 경우 DB에서 해당 필드는 빈칸이 된다.

 

imgfile = models.ImageField(null=True, upload_to="user_images", blank=True)

model에서 이미지 필드 코드 모습니다.

속성으로 달아준 blank=True덕분에 폼에서 작성하지 않아도 넘어가게 된다.

 

DB에서 이미지필드가 빈칸이 된 모습이다.

이렇게 db인 sqlite3에서는 빈칸이 된다.

즉 none으로 대체되는 것이다.

 


<폼으로 데이터 수정하기>

하지만 위의 사진 변경은 진짜 변경이 아니다.

엄밀히 보자면, 덮어쓰기로 볼수있다.

 

내가 만든 사진 업로드는 일부로 컴팩트하게 위처럼 마무리 했지만,

실제 게시글과 게시글 사진, 유저 자기소개 그리고 댓글에서의 수정은,

정말 수정 기능처럼 작동하게 만들어 주셨다.

 

 

놀랍게도, 작성을 위해 만든 폼을 수정을 위해서도 그대로 쓸수 있다.

(작성과 수정에서 폼모양이 같다면 그렇게 하면되고, 다르다면 간단하게 수정폼을 만들어주면 된다.)

 

update = TweetModel.objects.filter(id=update_id).first()

update_form = TweetForm(instance=update)
return render( 중략 {'form': update_form, 'update_id': update_id})

방법은 간단하게 TweetForm(instance=update) 이렇게 작성해주면 된다.

update에 우리가 다룰 인스턴스를 위에서 실어줬다.

그걸 폼(instance=해당 인스턴스)로 담아주고 form을 웹으로 보내주면,

해당 인스턴스의 내용이 작성되어 있는 폼이 사용자에게 보여진다.

 

플라스크때처럼 열심히 폼에 내용을 채워주지 않아도 되는 것이다.

 


<사진 파일을 지우기>

사진을 등록하고 수정하다보면 사진이 계속 media 디텍토리에 쌓일 것이다.

나는 유저 이미지에서 이부분을 그냥 뒀지만,

팀원 분께서는 트윗 이미지를 수정하거나 삭제할때 디렉토리의 사진 파일이 삭제되게 작성하셨다.

 

(굳이 두 부분을 똑같이 맞추지 않은 것은

두가지 다른 케이스가 됬기 때문이다.

유저 이미지와 트윗 이미지는 저장하는 동작부터 조금씩 다 차이점이 있다.)

 

os.remove(os.path.join(settings.MEDIA_ROOT, tweet.image.path))

디렉토리에 있는 파일을 지우는건 이런 명령어로 실행할수 있다.

 

삭제하는 경우에는 model.py에 트윗 모델에서,

클래스 메소드로 delete를 상속받은 다음 delete가 동작할때 위의 명령어가 실행되어

파일이 삭제될수 있게 했다.

 

수정하는 경우가 스마트하게 만들기 위해서 꽤 복잡해진다.

우선 해당 트윗 인스턴스를 가져와 변수에 담는다.

변수를 이용해 수정 폼을 작성해서 사용자에게 보내준다.

 

그럼 변경내용을 입력 받고 나서는, 

수정내용을 다시 폼으로 작성하는데 이 폼의 경우 경우의 수가 세가지이다.

blank=True를 기반해 빈값이 넘어왔을 경우,

새 사진이 입력됬을땐 원래 사진이 있었던 경우, 그리고 없었던 경우이다.

 

 

작성법에 따라 틀려지겠지만 주의할 점이 있다.

빈값이 넘어왔을 경우에 form에는 빈값이 된다.

이걸 만약 cleaned_data.get()을 이용해 따로 빼내어 인스턴스에 대입할 경우,

빈 값을 찾기 때문에 False를 반환한다.

이걸 그대로 대입하면 DB에 False가 저장되는 것이다.

 

 

결론적으로, 3가지 경우의 수가 모두 대응되도록 기능을 작성해야 한다.

그리고 혹시 DB에 빈칸으로 비워진게 아니라 False가 채워졌다면 잘 지워진게 아니니,

어떤 동작에서 False를 반환했는지 찾아봐야 한다.