Django 유저 프로필 수정

2022. 2. 8. 14:35강의 정리/Django 기초

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 


 

유저 프로필 수정 구현

 

form 작성 프로세스

  1. urls.py 에 주소 등록을 해준다.
  2. forms.py 에서 model을 import하여 Modelform을 작성해준다.
  3. views.py 에서 forms.py의 ModelForm의 객체를 생성해주고, html과 render해준다.
  4. 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/

 

썸네일 만들기 (PILKit, imagekit) ImageSpecField, ProcessedImageField · 초보몽키의 개발공부로그

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.

wayhome25.github.io

 

 


 

TextChoices 활용

https://docs.djangoproject.com/ko/4.0/ref/models/fields/

 

Model field reference | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

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에 반드시 추가한 필드들을 추가해주어야한다.

 

 

 

반응형