반응형

Custom User Model

 

Django에는 User Model을 만들 수 있는 내장 어플리케이션이 존재한다. 

이를 그냥 사용해도 되지만 몇가지를 더 곁들이기 위해서는 다음과 같은 동작을 수행해야한다. 

 

1. Create Custom User Model Application

poetry shell에서 새로운 어플리케이션을 만들어주는 명령어를 입력한다.

python manage.py startapp users

이렇게 되면 users 폴더가 만들어진다.

 

2.InHerit AbstractUser

users의 models.py에 들어가서 다음과 같이 입력하면 내장어플리케이션을 상속받을 수 있다. 

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.


class User(AbstractUser):
	pass

 

그리고 manage.py가 이 users app을 관찰할 수 있도록 manage.py에 등록해 주고 새로운 유저인증 모델을 지정한다.. 여기서 제일 중요한것은 유저인증 모델을 새로이 지정해줘야한다.

AUTH_USER_MODE = 'users.user'

 

3. Mirgate User Model

데이터베이스 새로운 model 생겼으므로 등록을 해줘야한다. 데이터가 존재하면 migrate할때 안될수도 있으니 데이터베이스 파일과 migrations 파일 내부에 있는 000_initial.py파일들을 삭제한다. 

python manange.py makemigrations
python manange.py migrate

를 해주면 된다. 

 

4.Editting User Model

기존에 있던 model에 새로운 column을 추가하거나 사용하지 않는 방법은 다음과 같다.

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.


class User(AbstractUser):
    first_name = models.CharField(max_length=150, editable=False)
    last_name = models.CharField(max_length=150, editable=False)
    name = models.CharField(max_length=150)
    is_host = models.BooleanField()

이후 makemigrations을 하게 되면 에러가 나온다. 이유인 즉슨 기존 model이  name과 is_host에 null 값을 받을 수가 없기 때문이다.이를 해결하기 위해서는  null=True나 default = value를 통해서 해결할수 있다. 개인적으로 default=value가 더 좋아보인다.

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.


class User(AbstractUser):
    first_name = models.CharField(max_length=150, editable=False)
    last_name = models.CharField(max_length=150, editable=False)
    name = models.CharField(max_length=150, default="")
    is_host = models.BooleanField(default=False)

 

5. FieldSet

user model를 추가한 후 user의 세부사항을 보기 위해 user를 클릭하게 되면 editable False에 의해 user의 fieldset을 바꿔줘야한다.

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

@admin.register(User)

class CustomAdmin(UserAdmin):
	fieldsets=None
	field = ("username","email","password","name","is_boolean",)

fieldset말고 field를 이용해 간결하게 사용해도 되지만 fieldsets은 admin 만의 section을 만들 수 있고 확장성이 용이하다.

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User
# Register your models here.


@admin.register(User)
class CustomUserAdmin(UserAdmin):
    fieldsets = (
        ("Profile",
         {"fields": ("username", "email", "password", "name", "is_boolean"), },
         ),
        ("Permissions",
         {
             "fields": (
                 "is_active",
                 "is_staff",
                 "is_superuser",
                 "groups",
                 "user_permissions",
             ),
             "classes": ("collapse",)
         },),
        ("Important dates", {"fields": ("last_login",
         "date_joined"), "classes": ("collapse",), },),
    )
    list_display = ("username", "email", "name", "is_boolean")

 

6.Foreign Keys

다른 모델과 연결하기 위해서는 Foreign Key를 이용해야한다. 쉽게 이해하자면 id값을  연결시켜주는 행위이다. Django에서는 id라 부르지 않고 PK(Primary Key)라고 부른다.  user model를 연결하고자 하는 model에 column을 변수를 추가하고 Foreign Key를 입력해준다. 연결된 model은 유저가 삭제되면 같이 삭제되기위해 on_Delete=model.CASCADE도 작성해준다. 

owner = models.ForeignKey("users.User", on_delete=models.CASCADE)

 

이또한 새로운 column이 추가되었기때문에 migrate를 해줘야한다. 그냥 migrate를 하게되면 기존에 있던 house model에 owner라는 column이 없기 때문에 default 값을 지정해줘야하기때문에 개발 초기나 default값을 지정하기 귀찮다면 db와 migrations의 파일을 지우고 다시 migrate를 하면 된다.

728x90

'CODING PRACTICE > Python' 카테고리의 다른 글

Django__001  (0) 2024.07.19
Object Oriented Programming (객체지향프로그램)  (0) 2024.07.18
Python__Basic__002  (0) 2024.07.17
Python__Basic__001  (2) 2024.07.16
반응형

Django

Django는 더 생산적인 개발자로 만들어줄것이다.

Django는 사용자 인증, 컨텐츠 관리, 사이트 맵, RSS 피드 등 많은 것들을 처리한다. 보안도 처리하고 sql 삽입, 사이트 간 스크립팅, 요청 위조, 클릭 재킹 같은 많은 일반적 오류에 대한 보안요소를 즐길수 있다. 

Poetry

공부하면서 느낀바로는 npm과 같은 느낌이었다.

poetry를 사용하기 위해서 가상환경을 만들어주어야하는데 이를 위해 해당 폴더 경로에 터미널에서 poetry init을 해준다.

 

init을 해주면 toml 파일이 생성되는데 이제여기다 원하는 패키지를 

poetry add <packageName>을 해주면된다. Django를 사용하기 위해서 django를 입력한다.

 

가상환경을 진입하기위해서 해당 폴더경로에서 터미널에 poetry shell를 입력해준다. 가상환경으로 들어와야지만 내가 사용하고 싶은 패키지의 명령어를 사용할수 있다.

 

가상환경에서 나가고 싶으면 터미널에서 exit을 입력하면 끝

 

Django Start Project

django를 사용하기 위해 다음과같은 명령어를 입력한다.

# 터미널
django-admin startproject <project name> <path>

 

djago의 서버를 사용하기 위해서 poetry shell안에서 아래 입력하면 서버가 생성된 것을 터미널에서 알려준다. 

python manage.py runserver

 

서버가 시작되면 터미널에 붉은색 글씨가 있는데 승인되지않은 마이그레이션이 18개가 있다고 나온다 이것을 마이그레이션하는 코드가 나온다. 앞으로도 데이터베이스의 모습이 바뀔때 많이 사용될테니 주의하자.

python manage.py migrate

 

CreateSuperUser

127.0.0.8000/admin

Django에는 admin pannel이 있는데 이 admin의 id/pw를 만들기 위해서 터미널에 다음과 같이 입력한다. 당연히 가상환경 안에서 입력해야한다.

python manage.py createsuperuser

 

First App

poetry shell에서 다음과 같이 입력한다.

python manage.py startapp <application name>

 어플리케이션 이름으로 입력된 폴더가 생성된다.

폴더안에는 여러 파이썬 파일이 생성되는데 

models.py에는 데이터의 모양을 django에게 알려주는 곳이다. 

 

# models.py 예시
from typing import Any
from django.db import models

# Create your models here.


class 클래스이름(models.Model):
    """ 관례로는 여기에 어떤것을 그렸는지 작성하면 좋음 """
    
    # CharField와 TextField의 차이는 CharField는 긴텍스트가 아닌 길지만 길이의 제한이 있는 텍스트이고
    # TextField는 긴텍스트를 이야기한다.
      
    name = models.CharField(max_length=140)
    price = models.PositiveIntegerField()
    descrition = models.TextField()
    address = models.CharField(max_length=200)

 이렇게 작성후 Django에게 작성한 어플리케이션에 대해 알려줘야하는데 이때 settings.py의 INSTALLED_APPS에 생성한 어플리케이션 폴더안에 있는 apps.py의 class이름을 모두 작성해주면된다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    '생성한폴더.apps.apps안의 클래스명'
]

이렇게 하면 모델을 저장할때마다 Django가 이를 감지하고 서버를 다시 시작한다.

 

Admin panel에서 보기 위하여 생성한 어플리케이션 폴더에 admin.py에 들어간다.

from django.contrib import admin
from .models import 해당 파일에서 불러올 클래스명을 입력

# Register your models here.

@admin.register(해당 파일에서 불러올 클래스명을 입력)
class 클래스명 (admin.ModelAdmin):
	# admin.ModelAdmin을 상속받는다.
    pass

 

이렇게 해서 admin panel를 보면 해당 모델이 추가가 되는 모습을 볼수있는데 클릭하게되면 404가 나온다. 이는 아직 데이터베이스에 반영이 된것이 아니라서 이렇게 나오는데 이를 위해서는 migration파일을 만들고 migrate를 해주면 된다. 이또한 가상환경에서 실행해야하며 다음과 같이 입력하면된다. 이렇게 하고 다시 admin panel에가 가게되면 정상적으로 페이지가 나오며 데이터 또한 수동으로 입력할 수 있다. models에 추가적인게 필요하면 추가를 하고 다음과 같이 다시 입력하면 데이터베이스에 반영이 된다.

# migration할 파일 생성
python manage.py makemigrations

# 데이터베이스에 migrate
python manage.py migrate

 

Admin Pannel

기본적으로 설정이된 User모델에 보면 그에 대한 정보가 보기 쉽게 나타날수 있다. 우리가 만든 모델도 동일한 방식으로 볼 수 가 있는데 이때 생성한 어플리케이션 폴더의 admin.py에서 설정해주면 된다. 

from django.contrib import admin
from .models import 해당 파일에서 불러올 클래스명을 입력

# Register your models here.

@admin.register(해당 파일에서 불러올 클래스명을 입력)
class 클래스명 (admin.ModelAdmin):
	# pass를 삭제하고 필요한 것들을 입력해준다.
    list_display = (
        "name", "price", "address", "pet_allowed"
    )
    list_filter = (
        'pet_allowed',
    )
    search_fields = ('address',)

https://docs.djangoproject.com/ko/5.0/ref/contrib/admin/

 

Django 관리자 사이트 | Django 문서

The web framework for perfectionists with deadlines.

docs.djangoproject.com

 

728x90

'CODING PRACTICE > Python' 카테고리의 다른 글

Django__002  (0) 2024.07.25
Object Oriented Programming (객체지향프로그램)  (0) 2024.07.18
Python__Basic__002  (0) 2024.07.17
Python__Basic__001  (2) 2024.07.16
반응형

oop는 Python에만 국한 된것이 아니라 많은 다른 언어들도 oop를 지원하고 있다.

oop를 사용하여 object 중심으로 데이터를 다루는 함수는 매우 직관적이고 생각하기 쉽다. javascript의 class를 생각하면 이해하기 쉽다.

class Charactor:
    def __init__(self): 
        self.name="Anduin"
        self.job = "cleric"
        self.mp=10
        

anduin = Charactor()

print(anduin.name)
print(anduin.job)
print(anduin.mp)

 

Method & Inheritence

class Charactor:
    def __init__(self ,name,job,mp,tribe): 
        self.name = name
        self.job = job
        self.mp = mp
        self.tribe = tribe

    def say_hello(self):
        return print(f'my name is {self.name}. And Iam {self.job}')
    def tell_magicpoint (self):
        return print(f'my Magic power if {self.mp}')
    def tell_my_tribe(self):
        return print(f'I am {self.tribe}')
    
class Hord(Charactor):
    def __init__(self,name,job,mp):
        super().__init__(
            name,
            job,
            mp,
            "Hord"
            )

    def for_hord(self):
        print("for the hord")

class Alience(Charactor):
    def __init__(self,name,job,mp):
        super().__init__(
            name,
            job,
            mp,
            "Alience"
            )

    def for_alience(self):
        print("for the alience")

anduin = Alience(name="anduin",job="cleric", mp=10)
print(anduin.name, anduin.job, anduin.mp )
anduin.say_hello()
anduin.tell_magicpoint()
anduin.for_alience()
anduin.tell_my_tribe()


silvanas = Hord(name="silvanas",job="Hunter", mp=20)
print(silvanas.name, silvanas.job, silvanas.mp )
silvanas.say_hello()
silvanas.tell_magicpoint()
silvanas.for_hord()
silvanas.tell_my_tribe()
728x90

'CODING PRACTICE > Python' 카테고리의 다른 글

Django__002  (0) 2024.07.25
Django__001  (0) 2024.07.19
Python__Basic__002  (0) 2024.07.17
Python__Basic__001  (2) 2024.07.16
반응형

IF 문

# if condition:
#     # write the code to run

a = 10
b = "hoho"
c = 10
if a<5:
    print("a smaller Correct")
if a>5:
    print("a bigger Correct")
if a == 5:
    print("a Correct")
if a != 5:
    print("a not Correct")
if b =="hoho":
    print("b Correct")
if b=="hoho" and c==a:
    print("b&c Correct")
if b=="hoho" or c==b:
    print("b or c Correct")

password_correct = True
if password_correct :
    print("IT IS TRUE")
else:
    print("Wrong Password")

# if not password_correct :
#     print("IT IS TRUE")
# else:
#     print("Wrong Password")

value = 199
if value == 200:
    print("same value")
elif value < 200:
    print("value is smaller")
else:
    print("value is higher")

 

Python Standard Libray

from random import randint
# javascript에서의 import {randint} from 'random' 와 같다
# import random 은 import random from random 과 같다


# user_choice = int(input("number"))
pc_choice = randint(1,20)
print(pc_choice)

 

While & For Loop

from random import randint

skills = ("smash","thunder","earthQuake","wolf's Spirits")

max_mp = 10
used_mp = 0
while used_mp < max_mp :
    cost = int(input("use mp 0 to 10 : "))
    usedCost = randint(0,3)
    
    
    if cost == 0 :
        print(skills[0])
        used_mp=used_mp+1
        print(f"{used_mp} // {max_mp}")
    elif cost == 1:
        print(skills[1])
        used_mp=used_mp+1
        print(f"{used_mp} // {max_mp}")
    elif cost ==2:
        print(skills[2])
        used_mp=used_mp+1
        print(f"{used_mp} // {max_mp}")
    elif cost ==3:
        print(skills[3])
        used_mp=used_mp-1
        print(f"{used_mp} // {max_mp}")
    else:
        print(f"Wrong!! You Use {skills[3]}. You Have Handicap")
        used_mp=used_mp+2
        print(f"{used_mp} // {max_mp}")


for skill in skills:
    print(f"Thrall used {skill}")

Data Structure

  • List
#List []를 사용해 생성
days = ["mon","tue","wend","thu","fri"]
# days = list(["mon","tue","wend","thu","fri","sat","sun"])
print(days)
days.append("sat")
days.append("sun")

print(days)
days.reverse()
print(days)
print(days[0])
print(days[1])
  • Tuples
#Tuples ()를 사용해 생성 / Tuples는 List와 달리 불변성을 가진다.
me = ("20","176","ginger",True)

 

  • Dict
#Dict / dictionary는 {}를 사용한다.
THRALL = {
    "name":"Thrall",
    "age":100,
    "alive":True,
    "skills":["smash","thunder"]
}
print(THRALL)
print(THRALL["age"])
print(THRALL.get('name'))
THRALL.pop("alive")
print(THRALL)
THRALL["mp"] = 30
print(THRALL)
THRALL["skills"].append("earthquake")
print(THRALL)

 

728x90

'CODING PRACTICE > Python' 카테고리의 다른 글

Django__002  (0) 2024.07.25
Django__001  (0) 2024.07.19
Object Oriented Programming (객체지향프로그램)  (0) 2024.07.18
Python__Basic__001  (2) 2024.07.16
반응형

HELLO WORLD

print("HELLO WORLD")

 

Variables

Python에서의 변수는 JavaScript와 유사하다. 다만 변수를 선언할때 관례는 snake_case로 작성해주어야한다.

a = 2
b = 3
c = a + b 
print(c)

a = 4
print(a)

hello_string="HELLO"

false_var=False
true_var=True
# boolean은 대문자로 시작해야한다.

print(hello_string)
print(false_var)
print(true_var)

 

Function / parameters

Python에서 함수는 def로 시작된다. 또한 중괄호 또한 필요가 없고 대신에 들여쓰기로 구분한다. 또한 동적언어라서 정적언어로 바꾸려면 전달 인자에 타입 지정뿐만아니라 if문을 통한 검열도 해줘야한다.

a=2
b=3
c=5
d=9
e="hello"
f="world"
g=10
h=11

def calculator (a, b):
    print(a+b)


calculator(a,b)
calculator(c,d)
calculator(g,h)

# def calculator(a:int, b:int)->int:
#     if not isinstance(a,int) or not isinstance(b,int):
#         raise TypeError("Must be Int")
#     print(a+b)

# calculator(e,f)


# def calculator (a=0, b=100):
#     print(a+b)

# calculator(3)
# calculator()

Return Values

def tax_calc(money):
    money**2

print(tax_calc(30))

# None

def tax_calc(money):
    return money**2

print(tax_calc(30))

# 900

Formatter

Javascirpt에서는 ${}을 사용했지만 Python에서는 f"" 로 작성해야한다.

my_name = "choi"
my_age = 14
my_hair_color = 'ginger'

print(f"hello my name is {my_name}. And I'm {my_age} years old. My Hair Color is {my_hair_color}")
728x90

'CODING PRACTICE > Python' 카테고리의 다른 글

Django__002  (0) 2024.07.25
Django__001  (0) 2024.07.19
Object Oriented Programming (객체지향프로그램)  (0) 2024.07.18
Python__Basic__002  (0) 2024.07.17

+ Recent posts