detail 페이지로 들어갔는데 사용자의 ID 가 노출되는 문제
-> ID 를 Nickname 으로 바꿔줄것.





# 새로운 app 인 profileapp 만들어주기
python manage.py startapp profileapp

pragmatic/settings.py 에 profileapp 추가# pragmatic/pragmatic/settings.py
...
INSTALLED_APPS = [
...
'accountapp',
'profileapp' # profileapp 을 사용하겠다고 명시
]
pragmatic/urls.py 에 profileapp 추가# pragmatic/pragmatic/urls.py
...
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/', include('accountapp.urls')),
path('profiles/', include('profileapp.urls')),
# include -> profileapp.urls (지금은 없는) 로 하위 분기하도록 연결시켜줌
]
profileapp.urls 로 하위 분기하도록 연결시켜줬기 때문에 profileapp 에 urls.py 파일 만들어주기# pragmatic/profileapp/urls.py
app_name = 'profileapp'
urlpatterns = [
]
# pragmatic/pragmatic/models.py
from django.contrib.auth.models import User
from django.db import models
# Create your models here.
class Profile(models.Model):
# Profile 과 user 를 하나씩 연결해준다.
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
image = models.ImageField(upload_to='profile/', null=True)
nickname = models.CharField(max_length=20, unique=True, null=True)
message = models.CharField(max_length=100, null=True)
OneToOneField(User, : 이 profile 의 주인이 누구인지on_delete=models.CASCADE, "user 가 탈퇴하면 profile 도 사라진다"on_delete : 연결되어있는 User 객체가 delete 될 때 그와 연결되어 있는 profile 객체가 어떤 행동을 보일것인지를 담당하는 것CASCADE : 객체가 사라질 때 이 profile 도 없어지도록 설정related_name='profile') request.user.profile 이런식으로 해당 user 객체의 profile 로 바로 연결할 수 있도록 이름을 설정upload_toMEDIA_URL = '/media/' ,MEDIA_ROOT = os.path.join(BASE_DIR, 'media') /media/ 밑에 profile/ 이라는 경로가 추가되어 그 안에 이미지가 다 저장되는 것이다. null=Truemax_length : 최대 20자unique=True : Profile 객체에서 이 nickname 은 하나가 유일해야함, 사람마다 고유한 닉네임을 가질 수 있도록 설정.null=True : 닉네임이 설정되지 않았다면 설정해달라는 메세지를 띄우는 방식으로 구현null=Trueaccountapp 의 view 에서 model 뿐만 아니라 form_class 를 지정해주었는데, 이 form을 만들어 주어야 함.
하지만 이것을 일일히 다 만들어 줄 수는 없다.
Form
Account App 에서UserCreationForm은 장고에서 기본적으로 제공해주는 계정에 관련된 Form 이였다.
하지만, Profile App 은 장고에서 제공해주지 않기 떄문에, 직접 만들어주어야 함.Profile Model
Model 과 비슷한 Form
- form 에서도 model 과 비슷한 필드들이 다 있다.
- 비슷하게 다음과 같이 새로운 form 을 만들어서 그 form 을 사용해야 한다.
- 이 내용들이 수십 수백개가 된다면, 일일이 내용을 타입핑 하는것이 어렵다 ModelForm
Model Form
- 기존에 있었던 모델을 form 으로 그대로 변환해주는 기능
- ModelForm 을 상속받은 후에 어떤 모델을 사용하고, 어떤 필드를 입력할 수 있게 만들 것 인지 설정.
그 모델이 그대로 form 으로 변환됨.
# pragmatic/profileapp/forms.py
from django.forms import ModelForm
from profileapp.models import Profile
class ProfileCreationForm(ModelForm): #ModelForm 상속 받기
class Meta:
model = Profile
fields = ['image','nickname','message'] # 사용할 필드
# model 에서는 user 라는 필드가 하나 더 있긴 하지만
# user 는 서버에서 따로 처리를 할것
