Python/Django Framework

[Python Django] 2-4. FBV Form을 이용한 Update 구현

Jake the Dog 2022. 3. 26. 09:31
반응형

모델 변경

  • 유저 모델을 약간 수정하였습니다
  • insert_date 옵션을 auto_now => auto_now_add로 바꾸고, update_date를 추가해주었습니다.
  • auto_now는 저장될 때마다 시간을 기록하고, auto_now_add는 생성 시점의 시간을 기록합니다.
# user/models.py

class User(models.Model):
    user_name = models.CharField(max_length=64, verbose_name="사용자 명")
    user_email = models.EmailField(max_length=256, verbose_name="이메일")
    password = models.CharField(max_length=256, verbose_name="비밀 번호")
    insert_date = models.DateTimeField(auto_now_add=True, verbose_name="등록일") # 수정
    update_date = models.DateTimeField(auto_now=True, verbose_name="최종수정일") # 추가
  • 마이그레이션 실행
$ python3 manage.py makemigrations
$ python3 manage.py migrate

Form 추가

class UpdateForm(forms.ModelForm):
    user_name = forms.CharField(
        max_length=64,
        label="사용자 명",
        error_messages={"required": "사용자 명을 입력해주세요"}
    )
    user_email = forms.EmailField(
        max_length=256,
        label="이메일",
        error_messages={"required": "이메일을 입력해주세요"}
    )
    password = forms.CharField(
        widget=forms.PasswordInput,
        min_length=8,
        max_length=16,
        label="비밀번호",
        error_messages={"required": "비밀번호를 입력해주세요"}
    )
    re_password = forms.CharField(
        widget=forms.PasswordInput,
        min_length=8,
        max_length=16,
        label="비밀번호 확인",
        error_messages={"required": "비밀번호 확인을 입력해주세요"}
    )

    class Meta:
        model = User
        fields = ['user_name', 'user_email', 'password']

    def clean(self):
        clean_data = super().clean()
        password = clean_data.get('password')
        re_password = clean_data.get('re_password')

        if password != re_password:
            self.add_error('password', '비밀번호를 확인해주세요')
            self.add_error('re_password', '비밀번호를 확인해주세요')
            return

Update 템플릿 파일 생성

# user/templates/update.html

{% extends "base.html" %}
{% block contents %}
    <div class="row mt-5">
        <div class="col-12 text-center">
            <h1>회원 정보 수정</h1>
        </div>
    </div>
    <div class="row mt-5">
        <div class="col-12">
            {{ error }}
        </div>
    </div>
    <div class="row mt-5">
        <div class="col-12">
            <form method="POST" action=".">
                {% csrf_token %}
                {% for field in form %}
                    <div class="mb-3">
                        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
                        <input type="{{ field.field.widget.input_type }}" class="form-control"
                               id="{{ field.id_for_label }}"
                               placeholder="{{ field.label }}"
                               name="{{ field.name }}"
                               value="{{ field.value }}"
                        />
                    </div>
                    {% if field.errors %}
                        <div style="color:red">{{ field.errors }}</div>
                    {% endif %}
                {% endfor %}
                <div class="d-grid mt-3">
                    <button class="btn btn-lg btn-primary" type="submit">회원수정</button>
                </div>
            </form>
        </div>
    </div>
{% endblock %}

Views에 Update 함수 추가

  • Form을 설정할때 initial 데이터를 전달하면 fileld.value값으로 기본값을 가져올 수 있습니다.
  • 저장 시에는 불러온 user의 값을 전달받은 값으로 수정한 뒤. save()를 통해 데이터를 저장해줍니다.
# user/views.py

def update(request):
    user_id = request.session.get('user_id')

    if not user_id:
        return redirect("/user/login/")
    else:
        try:
            user = User.objects.get(id=user_id)
        except User.DoesNotExist:
            return redirect("/user/logout/")

    if request.method == 'GET':
        form = UpdateForm(initial={
            'user_name': user.user_name,
            'user_email': user.user_email,
            'password': '',
            're_password': ''
        })
        return render(request, 'update.html', {'form': form})
    elif request.method == 'POST':
        form = UpdateForm(request.POST)
        if form.is_valid():
            user.user_name = form.cleaned_data.get('user_name')
            user.user_email = form.cleaned_data.get('user_email')
            user.password = form.cleaned_data.get('password')
            user.save()
            return redirect("/user/detail/")
        else:
            return render(request, 'update.html', {'form': form})
반응형