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})
반응형