1)
{% if form %}
<form actioin="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
<!--<table>
{{ form }}
</table>-->
{% buttons %}
<button type="submit" class="btn btn-primary">
{{ submit_label|default:"Submit" }}
</button>
{% endbuttons %}
<!--<input type="submit" />-->
</form>
{% else %}
<div class="alert alert-danger">
form 객체를 지정해주세요.
</div>
{% endif %}
views.py의 profile_edit이 아직 'form'을 넘겨주지 않아서 _form.html에도 form이 전달되지 않을 경우를 설정해줬다.
2)
def signup(request):
if request.method == 'POST':
form = SignupForm(request.POST)
if form.is_valid():
signed_user = form.save()
...
@login_required
def profile_edit(request):
if request.method == 'POST':
form = ProfileForm(request.Post, request.FILES, instance=request.user)
else:
form = ProfileForm(instance=request.user)
signup 함수에서는 아직 유저 정보가 없어서 User를 Model로하는 빈 SignupForm instance를 생성하는 게 목적이었지만, ProfieForm에서는 현재 user에 해당하는 instance 를 할당해준다.
3)
accounts의 models.py의 User 모델에서 성별, 휴대폰 번호를 추가해주고 makemigrations-migrate accounts를 차례대로 진행했다. blank=True 옵션 여부에 따라서 db 관련한 추가적인 입력이 필요할 수 있음에 주의하자.
4)
profile = models.ImageField(blank=True)
ImageField 역시 파일의 '경로'를 저장하는 거라서 CharField의 일종으로 볼 수 있다. 그리고 pillow 라이브러리 설치가 필수적이다.(아니면 migration 실패함)
이를 ProfileForm을 이용해서 views.py에서 request.FILES(브라우저와 서버 사이)로 파일을 받는지와, form 저장을 통해 템플릿으로 넘겨줄 때 enctype(브라우저 영역)이 준비돼 있는지 확인하도록 하자.
CBV에서는 request.POST, request.FILES가 자동으로 적용된다고 한다.
이미지킷 라이브러리를 사용하면 크기나 확장자 등을 유효성 검사하는 validator도 설정 가능하다.