[Django] 비 SPA 방식으로 장고 Forms/Views를 적극 활용한 인스타그램 St 만들기#5_프로필 수정 구현과 장고3에서 추가된 TextChoices 활용

아직·2022년 7월 11일
0
post-thumbnail

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도 설정 가능하다.

0개의 댓글