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 |