웹 프로그래밍

[pinterest clone (22)] ModelForm

728x90
반응형

Profileapp을 만들기 시작한다.

Account와 Profile을 1:1 로 매칭. 1개의 account는 1개의 profile을 가진다.

구성:

  • Profile Image
  • Profile Nickname
  • Profile Message

Delete View는 만들지 않을것이고, Detail View도 profile을 따로 보여주는 페이지를 안만들거니까 구현하지 않는다.


1

python manage.py startapp profileapp

 

2

settings.py에 추가

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'accountapp',
    'bootstrap4',
    'profileapp',
]

 

3

urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('accountapp.urls')),
    path('profiles/', include('profileapp.urls')),
]

4

profileapp/urls.py 생성

app_name = 'profileapp'

urlpatterns = [
    
]

 

5

이제 db랑 연동을 해야하니까 담고자하는 model을 만들어야한다. 

models.py

 

from django.contrib.auth.models import User
from django.db import models

# Create your models here.

class Profile(models.Model):
    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() 는 장고에서 주는 필드중 하나인데 이 프로필과 유저객체를 하나씩 연결해준다

on_delete: 연결되어 있는 User 객체가 delete 될때 그와 연결되어 있는 profile객체가 어떤 행동을 보일것인지.

즉 CASCADE로 해놓은건 없어질때 그 프로필도 없어지게 설정을 한것. (유저가 탈퇴하면 프로필도 없어진다)

related_name: 연결해서 바로 접근할 수 있도록함

upload_to: 이미지 저장경로

unique: 유일성

 

6

accountapp에서 썼던 UserCreationFormn의 경우엔 장고에서 제공하는 기본 폼이기 때문에 그냥 썼었는데

profileapp은 제공되는 게 없다.

원래는 ProfileCreationForrm을 새로만들어서 

class ProfileCreationForm(forms.Form)
	image = forms.ImageField(upload_to='profile/', numm=True)
    nickname = forms.CharField(max_length=20)
    ......
    

이런식으로 쭉 작성해줘야한다. 근데 너무 많으면 힘드니까 Model Form이라는게 존재한다.

기존에 있었던 모델을 form으로 변환해주는 그런 기능!

ModelForm을 상속받고 어떤 모델을 사용할 건지 어떤 필드를 입력할 수 있게할건지 설정.

 

profileapp/forms 생성

from django.forms import ModelForm

from profileapp.models import Profile


class ProfileCreationForm(ModelForm):
    class Meta:
        model = Profile
        fields = ['image', 'nickname', 'message'] #user는 서버에서 처리해줄것

 

7

python manage.py makemigrations

python manage.py migrate

 

728x90
반응형