개인 프로젝트/Django로 Airbn* 클론 코딩하기

[Airbn* Clone Coding #3] Admin.py와 Models.py

Jinomad 2020. 9. 28. 23:44

Contents

  1. Django Documentation

  2. settings.py

  3. Admin.py와 Models.py  

  4. Django Models 모듈의 종류 

 


 

Django Documentation

 

Django Documentation : docs.djangoproject.com/

 

 Django Documentation은 말그대로 Django에 관한 정보를 문서화 해놓은 것입니다. 

Django에 관련된 모든 정보들이 위 URL의 사이트에 들어가 있다고해도 과언이 아닙니다. 

 

주로 이용되는 세부주소를 조금씩 추가해나갈 예정입니다. 

 

①  settings.py : docs.djangoproject.com/en/3.1/ref/settings/ setting.py 파일에 대한 문서 

 

Settings.py

 settings.py에는 django를 사용하기 위해서 필요한 설정들을 정의해주어야 합니다. 

 

① AUTH_USER_MODEL = 'myapp.MyUser' 

 Django에서는 기본적인 user 모델을 제공합니다. 하지만 django에서 제공하는 user 모델이 마음에 들지 않아서 다른 유저 모델로 덮어쓰고 싶다면, AUTH_USER_MODEL의 값을 설정해주어야 합니다. 

 

MEDIA_ROOT = os.path.join(BASE_DIR, "uploads"

 유저가 업로드한 파일을 BASE_DIR 경로의 "uploads" 폴더에 저장해야 된다고 알려줍니다. "uploads" 외에 마음대로 폴더의 이름을 지정할 수 있습니다. 

 

MEDIA_URL = "/media/"

  MEDIA_ROOT의 URL에서 다른 URL로 대체합니다. 위의 예제에서는 "/media/"로 대체.

 

INSTALLED_APPS = 장고 기본요소 + ['appname.apps.AppnameConfig']

 위의 예제에서 '장고 기본요소'란 프로젝트를 생성했을 때 이미 INSTALLED_APPS에 존재하던 내용들을 말합니다. 뒤에 더해주는 것은 추가로 사용하고 싶은 앱이 존재한다고 장고에게 알려주는 것입니다. 즉, 추가로 생성한 앱이 존재한다면 사용하기 위해서는 반드시 이곳에 알려주어야 장고가 인식할 수 있습니다. '장고 기본요소'는 추가할 앱들과 헷갈릴 가능성이 있으니 서로 다른 변수에 저장해서 더해주는 방식으로 사용하는 것을 추천드립니다. 

 

예시)

  1. DJANGO_APPS = ['django.contrib.admin']
  2. PROJECT_APPS = ['core.apps.CoreConfig']
  3. INSTALLED_APPS = DJANGO_APPS + PROJECT_APPS

 

 

Admin.py 와 Models.py

저번 글에서 간단하게 설명한 admin.py와 models.py에 대해서 자세하게 설명하겠습니다. 

다시 한번 간단하게 설명하자면 

 

admin.py : 관리자 패널에서 GUI를 통해 관리할 모델을 선언하는 페이지

# admin.ModelAdmin의 list_display, list_filter를 이용한 방법 

from django.contrib import admin
from . import models


@admin.register(models.User)
class CustomUserAdmin(admin.ModelAdmin):

    """ Custom User Admin """

    list_display = (
        "username",
        "email",
        "phonenumber",
        "gender",
        "address",
        "superhost",
    )

    list_filter = ("gender", "superhost")

 

admin.py는 models.py를 기반으로 관리자 패널을 구성합니다. 

"list_display"나 "list_filter"는 Django가 주시하고 있는 변수명으로 위의 코드처럼 설정할 경우 models.py에 있는 어트리뷰트명을 관리자 패널에서 확인할 수 있습니다. 

 

디스플레이와 필터

위의 "admin.ModelAdmin"을 이용한 방법보다 더 쉬운 방법이 있습니다. 

그것은 바로 "UserAdmin"을 이용하는 방법입니다.

 

# UserAdmin의 fieldsets를 이용한 방법

from django.contrib.auth.admin import UserAdmin
from django.contrib import admin
from . import models

@admin.register(models.User)
class CustomUserAdmin(UserAdmin):

    """ Custom User Admin """

    fieldsets = UserAdmin.fieldsets + (
        (
            "Custom Profile",
            {
                "fields": (
                    "gender",
                    "phonenumber",
                    "birthday",
                    "address",
                    "superhost",
                ),
            },
        ),
    )

 

UserAdmin의 관리자 패널

UserAdmin을 이용한 방법입니다.  

참고로 class 안에 있는 fieldsets는 위의 이미지에는 영향을 주지 않습니다. 

단순히 UserAdmin을 상속해주는 것만으로도 필터와 기본적인 디스플레이, 검색 기능을 지원해줍니다. 

 

그럼 fieldsets는 어디에 영향을 주었을까요? 

위의 fcare를 클릭하고 들어가면 위의 이미지처럼 fieldset이 생성되어 있는 것을 볼 수 있습니다.

기존의 필드셋을 유지하고 우리가 추가한 필드셋을 추가하기 위해서 "UserAdmin.fieldsets"에 새로운 필드셋을 추가해준 것입니다. 

 

 

models.py : 원하는 데이터베이스가 어떻게 생겼는지 설명해주는 파일

from django.db import models
from django.contrib.auth.models import AbstractUser
from phonenumber_field.modelfields import PhoneNumberField


class User(AbstractUser):

    """ Custom User Model """

    GENDER_MALE = "male"
    GENDER_FEMALE = "female"
    GENDER_CHOICES = (
        (GENDER_MALE, "Male"),
        (GENDER_FEMALE, "Female"),
    )

    avatar = models.ImageField(null=True, blank=True)
    gender = models.CharField(choices=GENDER_CHOICES, max_length=10, null=True)
    phonenumber = PhoneNumberField(null=True)
    birthday = models.DateField(null=True)
    address = models.TextField(null=True, blank=True)
    superhost = models.BooleanField(default=False)

"AbstractUser"를 상속받아서 새로운 유저 모델을 설정해주었습니다. Django에서 기본적으로 User 모델을 지원하지만 프로젝트에 따라서 User 모델이 상이할 수 있기 때문에 위처럼 변경할 수 있습니다. 위의 코드에서는 기존의 User 모델에서 여러가지 속성(어트리뷰트)를 추가했습니다. 

 

 

Django Models 필드의 종류 

①