Django/Django study

[Django]회원 프로필 수정

카늬 2022. 11. 27. 18:52

User에 nickname을 넣어놨는데 profile로 옮기는게 관리에 좋겠다고 생각하여 바꿔주었다.

 

models.py

#models.py
from django.db import models
from django.contrib.auth.models import AbstractUser 

#auth의 유저 상속
class User(AbstractUser):
    """
        이름
        이메일
    """
    

    name = models.CharField(max_length=15)
    email = models.EmailField()
    
    
    class Meta:
        db_table = "User"
        
        
    def __str__(self):
        return self.email
    
#models.py
#프로필
class Profile(models.Model):
    """    
        유저아이디
        닉네임
        프로필이미지
        프로필소개글
    """

    user = models.OneToOneField(User,on_delete=models.CASCADE)#유저와 1:1 join
    nickname = models.CharField(max_length=15,unique=True,null=True)
    profile_img = models.ImageField(blank=True,upload_to="images/")
    profile_content = models.TextField(blank=True)

 

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from common.models import Profile


# error
# Manager isn't available; 'auth.User' has been swapped for 'common.User' 
from django.contrib.auth import get_user_model
User = get_user_model()

class UserForm(UserCreationForm):
    
    name = forms.CharField(label="이름")
    email = forms.EmailField(label="이메일")
    

    class Meta:
        model = User
        fields = ['username','password1','password2',"name",'email']
        

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['nickname','profile_img','profile_content']
        labels = {
            'nickname' : '닉네임',
            'profile_img' : '프로필이미지',
            'profile_content' : '프로필소개글',
        }

 

views.py

#회원가입
def singup(request):
    if request.method == "POST":
        form = UserForm(request.POST)
        if form.is_valid():
            user_profile = form.save()
            username = form.cleaned_data.get('username') #form.cleaned_data.get //개별적으로 값을 얻고 싶을 경우 사용
            
            Profile.objects.create(user=user_profile,nickname=username) #프로필 생성
            
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(request, username = username,password=raw_password)#사용자 인증
            login(request,user,backend='django.contrib.auth.backends.ModelBackend')#로그인
            return redirect('/')
    else:
        form = UserForm()
    return render(request,'common/signup.html',{'form':form})


						............


#프로필수정
@login_required(login_url="common:login")
def profile_modify(request,user_id):
    
    profile = get_object_or_404(Profile,user_id = user_id)

    if request.user.pk != profile.user_id:
        messages.error(request,'수정권한이 없습니다.')
        return redirect("common:profile_detail",user_id = profile.user_id)        
    if request.method == "POST":
        form = ProfileForm(request.POST,request.FILES,instance=profile)
        if form.is_valid():

            profile = form.save(commit=False)
            
            profile.save()
            return redirect("common:profile_detail",user_id = profile.user.id)
    else:
        form = ProfileForm(instance=profile)
    context = {'form':form}
    return render(request,"common/profile_modify.html",context)

기존에는 회원가입과 동시에 프로필만 생성되게 하였는데 이제는 프로필생성 후 nickname을 회원의 아이디로 넣어놓았다.

 

 

urls.py

urlpatterns = [
				...
	path('profile_modify/<int:user_id>/',views.profile_modify,name='profile_modify'),
    
]

 

profile_modify.html

{% extends 'base/base.html' %}
{% block content %}
<div class="container">
    <h5 class="my-3 border-bottom pb-2">프로필</h5>
    <form method="post" enctype="multipart/form-data">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit" class="btn btn-primary">저장하기</button>
    </form>
</div>
{% endblock  %}

 

5줄의 "enctype="multipart/form-data"을 넣지 않으면 파일이 정상적으로 들어가지 않는다

 

실행화면

정상적으로 잘 변경된다

'Django > Django study' 카테고리의 다른 글

[Django] 팔로우 언팔로우  (1) 2022.12.10
[Django] 친구추가, 팔로우 목록조회  (0) 2022.12.07
[Django] 회원 프로필 만들기  (0) 2022.11.26
[Django] User Custom  (0) 2022.11.24
Django-allauth 소셜로그인  (0) 2022.11.15