2022. 2. 8. 14:35ㆍ강의 정리/Django 기초
장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!
유저 프로필 수정 구현
form 작성 프로세스
- urls.py 에 주소 등록을 해준다.
- forms.py 에서 model을 import하여 Modelform을 작성해준다.
- views.py 에서 forms.py의 ModelForm의 객체를 생성해주고, html과 render해준다.
- html 에서 form 형식으로 작성해준다.
# ImageField 필드가 있다면 반드시 템플릿의 form enctype이 "multipart/form-data" 이어야 하고,
views.py의 함수에서 폼 객체를 생성할 때 request.FILES를 꼭 넣어주어야 한다.
#accounts/urls.py
urlpatterns = [
path('edit/', views.profile_edit, name='profile_edit'),
]
#accounts/views.py
@login_required
def profile_edit(request):
if request.method == 'POST':
form = ProfileForm(request.POST, request.FILES, instance=request.user)
if form.is_valid():
form.save()
messages.success(request, "프로필이 수정 되었습니다!")
return redirect("profile_edit")
else:
# 프로필, 암호 수정 함수에서 빈 form 객체를 바로 만들면 안됨
# 그 이유는 폼이 모델에 대한 모델 폼이기에 수정이 아닌 새로운 걸 생성 하려 함
form = ProfileForm(instance=request.user)
return render(request, "accounts/profile_edit_form.html", {
"form" : form,
})
#accounts/forms.py
class ProfileForm(forms.ModelForm):
class Meta:
model = User
fields = [
'first_name', 'last_name', 'website_url', 'bio'
]
#프로젝트/templates/프로젝트/layout.html
<a class="p-2 text-dark" href="{% url 'profile_edit' %}">
{{ user }}
<img src= "{% url "pydenticon_image" user.username%}" style="width: 24px; height: 24px;" />
프로필
- layout.html 은 모든 템플릿의 부모 템플릿이다.
#프로젝트/templates/프로젝트/_form.html
{% load bootstrap4 %}
<div class="card">
{% if form_title %}
<div class="card-header">
{{ form_title }}
</div>
{% endif %}
<div class="card-body">
{% if form %}
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
<button type="submit" class="btn btn-primary">
Submit
</button>
{% endbuttons %}
</form>
{% else %}
<div class="alert alert-danger">
form 객체를 지정해주세요!
</div>
{% endif %}
</div>
</div>
- 만약 form 객체가 있으면 form을 보여주고, 없으면 alert 경고문을 띄워준다.
- _form.html 은 form.html 들의 부모 템플릿이다.
#accounts/templates/accounts/profile_edit.html
{% extends "accounts/layout.html" %}
{% load bootstrap4 %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-sm-6 offset-sm-3">
{% include "_form.html" with form_title="프로필 수정" submit_label="프로필 수정" %}
</div>
</div>
</div>
{% endblock %}
# 장고의 여러 라이브러리를 통해서 썸네일을 더 자세히 구현할 수 있다
https://wayhome25.github.io/django/2017/05/11/image-thumbnail/
TextChoices 활용
https://docs.djangoproject.com/ko/4.0/ref/models/fields/
TextChoices는 Model 필드의 한 옵션이다.
TextChoices의 말 그대로 User로 하여금 선택지를 주어서 선택 받은 값을 모델 필드에 저장하는 것이다.
class User(AbstractUser):
class GenderChoices(models.TextChoices):
MALE = "Male", "Male"
FEMALE = "Female", "Female"
gender = models.CharField(blank=True, max_length=6, choices=GenderChoices.choices, default=GenderChoices.MALE)
위 코드가 TextChoices를 사용한 예시이다.
MALE = "Male", "Male"
앞의 "Male"이 실제 DB 값이고, 뒤의 "Male"은 실제 보여지는 값이다.
gender = models.CharField(blank=True, max_length=6, choices=GenderChoices.choices, default=GenderChoices.MALE)
choices는 TextChoices 클래스를 받고, default는 선택을 안할시 자동 선택되는 값을 의미한다.
실제 페이지에서 TextChoices가 어떻게 나타나는지 보자
# forms.py에 반드시 추가한 필드들을 추가해주어야한다.
'강의 정리 > Django 기초' 카테고리의 다른 글
Django 포스팅 쓰기 구현하기 (0) | 2022.02.14 |
---|---|
Django 암호 수정 구현하기 (0) | 2022.02.08 |
Django 프로필 디폴트 이미지 구현하기 (0) | 2022.02.07 |
Django 로그인, 로그아웃 구현하기 (0) | 2022.02.07 |
Django 회원 가입 이메일 보내기 (1) | 2022.02.05 |