상세 컨텐츠

본문 제목

피로그래밍14기: day10 오전 <DJANGO DB>

환 codes web/DJANGO

by 퍼블리셔환 2021. 1. 19. 09:19

본문


개념적 데이터 모델링(ER 다이어그램): 순서도 느낌으로 전체 계획을 세우기
논리적 데이터 모델링(릴레이션 스키마)

개체(entity)이거 object(객체) 아님
개체는 현실 세계의 대상체, 데이터베이스에 표현하려는 것

GENDER_CHOICES와 같이 바뀌지 않는 튜플 값을 넣을때는 대문자로 쓴다

유저정보와 같은 애들은 그냥 AbstractUser와 같이 이미 만들어져 있는 애들을 쓴다

related_name=''이거는 다른 객체에서 해당하는 foreignkey의 객체를 불러올때 사용하는 이름이다. 그래서 product의 user에 대한 relatedname은 product를 불러와야되니까 product라고 써준다

User모델의 속성을 바꿀거면 settings에 들어가서 AUTH_USER_MODEL='users.User'라고 추가해줘야됨

자동으로 입력 주소를 이동하게 하려면 url에 path('', lambda req: redirect('blog:post_list')) 이렇게 입력해주면 된다.
로그인을 한 다음에 직전에 보던 페이지로 이동하게 하려면
<a href="{% url 'login' %}?next={{request.path}}"> 로그인</a>
뒤에 next어쩌고 써줘야됨.


login 구현하기

from django.contrib.auth import views as auth_views

path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='login')
여기서 원래는 template_name='어쩌구'이렇게 써야되는데 우리는 django의 auth view에서 이미 register login.html에 정의해놨다고 해서 그 경로를 고치면 된다. 그래서 as_view()안에 accounts/login.html을 넣으면 된다.
아니면 장고의 기본 세팅에 들어가서 template_name을 'accounts/login.html'로 바꿔주면 된다. 해보니까 그냥 됐음

reverse_lazy: 얘는 언제 쓸까?
=> 원래 reverse함수는 settings에 있는 설정이 초기화됐을때 호출된다. 그런데 우리가 만약 reverse를 함수의 중간에 호출하게 되면 함수에 있는 정보들이 다 호출되기도 전에 초기화를 해버리고 reverse를 실행하기 때문에 에러가 난다. 따라서 reverse의 역할을 하지만, 함수의 정보들을 모두 호출한 다음에 reverse를 실행하기 위해서 reverse_lazy를 사용한다.
=>쉽게 설명하자면, setting에 있는 함수를 호출할 때는 reverse_lazy를 사용한다고 생각하면 편하다

app을 여러 개를 만들면 항상 각 app의 url페이지에서 app_name을 설정해줘야된다. 나중에 reverse방식을 쓸 때 app_name을 지정해주지 않으면 config 에 있는 url의 name으로 인식돼서 오류가 생기기 때문이다

장고에 있는 기본 logout을 사용하면 안된다. 이유는, 기본 logout view가 관리자 계정에 한해서만 구현되어있기 때문이다. 따라서 이 logout 을 사용할 때는 일반 사용자들도 사용할 수 있도록 커스터마이징이 필요하다
LOGOUT_REDIRECT_URL = reverse_lazy('accounts:login')
settings에 들어가서 logout이 됐을 때의 redirect url을 다음과 같이 넣어주면 된다.

새로운 유저를 만들때는
from django.contrib.auth.forms import UserCreationForm
이 라이브러리를 임포트 해서 사용한다.
여기를 커스텀 하려면, view의 def signup 에서 form=UserCreationForm(request.POST)를 form=SignupForm(request.POST)로 바꾸고 account 안에 forms.py를 따로 생성해서 그 안에 SignupForm class를 지정하고 만들면 된다.

만약 모델에 새로운 속성을 추가한 뒤에 마이그레이션을 하는 경우가 생겻다고 가정하자
해당 모델으로부터 상속받아서 생성한 객체들은 새롭게 추가된 속성에 대한 값을 지정받지 못했기 때문에 오류가 생긴다. 이때, migrations에서 0001등에 들어간 뒤에 RunPython 모델을 이용할 수 있다. 새롭게 모델의 객체가 생성됐을 때, 즉 operations가 호출됐을때 migrations.RunPython()를 넣어주고 그 안에 def forward_func와 backward_func를 넣어준다. 이거 약간 존나 어렵다
아 근데 이거를 꼭 써야되는 경우는 이미 모델을 만들었는데 기존의 객체들과 충돌이 일어날 경우이고, 처음부터 잘 만든 다음에 새롭게 추가되는 속성들의 경우에는 프로필페이지로 이동시켜서 입력받으면 될듯하다

관련글 더보기

댓글 영역