본문 바로가기
개발/AWS

Django 앱 만들기 - startapp으로 만든 앱 수정하기

by ny0011 2021. 1. 18.
반응형

1. Django 앱 만들기

0) 계획 세우기 

- 기능을 구현할 앱을 작은 단위로 쪼개자

- 한 문장으로 표현될 수 있게 앱 단위를 나누면 좋다

 

1) 앱 만들기

- 아래 생성된 파일들의 이름을 바꾸면 안됨 

- admin : django의 admin 패널에 반영됨( :8000/admin)

- apps : config 파일

- models : data 파일. DB가 어떻게 구성되어야 하는지 적음. 데이터의 형태

- test : test

- views : html을 render

- migrations : models에서 변경하면 이 폴더 및에 migrations이 만들어진다

django-admin startapp users

.
├── __init__.py
├── admin.py
├── apps.py
├── migrations
├── models.py
├── tests.py
└── views.py

- config/settings.py에 새로 만든 앱을 추가하기

DJANGO_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

PROJECT_APPS = [
    "users.apps.UsersConfig",
]

INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS

# 이미 있는 user 모델을 바꿔서 내가 생성한 users를 보도록 추가해줌
AUTH_USER_MODEL = "users.User"

 

- models에 User class 만들고 bio 필드 만들기

-> bio에 default 넣어주기

You are trying to add a non-nullable field 'bio' to user without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py
Select an option: 2

 

- Image field는 Pillow 설치해주자

users.User.avatar: (fields.E210) Cannot use ImageField because Pillow is not installed. HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".


pipenv install Pillow

 

- CharField에 choice 옵션을 줄 수 있따

tuple로 구성해서 왼쪽이 DB에 저장되는 것, 오른쪽이 웹에 보여줄 것

default="ㅌㅌ" : 기본으로 "ㅌㅌ"를 넣어줌

null=True : 빈 값도 상관없음(DB에서)

blank=True : 이게 false면 이 값은 무조건 채워야 함("" 허용 안함)

 

- User class : DB의 테이블

- avatar : 필드

class User(AbstractUser):

    """ Custom User Model """
    GENDER_MALE = "male"
    GENDER_FEMALE = "female"
    GENDER_OTHER = "other"
    GENDER_CHOICES = (
        (GENDER_MALE, "Male"), (GENDER_FEMALE, "Female"), (GENDER_OTHER, "Other"))

    LANGUAGE_ENGLISH = "en"
    LANGUAGE_KOREAN = "ko"
    LANGUAGE_CHOICES = (
        (LANGUAGE_ENGLISH, "English"),
        (LANGUAGE_KOREAN, "Korean")
    )

    CURRENCY_USD = "usd"
    CURRENCY_KRW = "krw"
    CURRENCY_CHOICES = (
        (CURRENCY_USD, "USD"),
        (CURRENCY_KRW, "KRW")
    )

    avatar = models.ImageField(null=True, blank=True)
    gender = models.CharField(choices=GENDER_CHOICES, default=GENDER_FEMALE,
                              max_length=10, null=True, blank=True)
    bio = models.TextField(default="", blank=True)
    birthdate = models.DateField(null=True)
    language = models.CharField(
        choices=LANGUAGE_CHOICES, max_length=2, null=True, blank=True, default=LANGUAGE_KOREAN)
    currency = models.CharField(
        choices=CURRENCY_CHOICES, max_length=3, null=True, blank=True, default=CURRENCY_KRW)
    superhost = models.BooleanField(default=False)

 

- admin.py에 기존 UserAdmin의 fieldsets과 함께 내가 만든 User 필드를 보여주고 싶으면 아래처럼 설정

내가 만든 User모델은 @admin.register에 등록해야 볼 수 있다

# admin.site.register(models.User, CustomUserAdmin) 와 같다
@admin.register(models.User)
class CustomUserAdmin(UserAdmin):
    """ Custom User Admin """

    fieldsets = UserAdmin.fieldsets+(
        (
            "Custom Profile",
            {
                "fields": (
                    "avatar",
                    "gender",
                    "bio",
                    "birthdate",
                    "language",
                    "currency",
                    "superhost",
                )
            }
        ),
    )

 

- Django

 

찾아보기

* Django ORM(Object Relational Mapping) : models.py에 적어둔 파이썬 코드를 SQL로 바꿔서 DB와 연동함

댓글