
# 에러 방지
Student.detail_info(studt1)
Student.detail_info(studt2)
# 비교
print(studt1.__class__, studt2.__class__)
print(id(studt1.__class__) == id(studt2.__class__))
print()
# 인스턴스 변수
# 직접 접근(PEP 문법적으로 권장x)
# studt1._name = 'HAHAHA'
print(studt1._name, studt2._name)
print(studt1._email, studt2._email)
print()
print()
# 클래스 변수
# 접근
print(studt1.student_count)
print(studt2.student_count)
print(Student.student_count)
print()
print()
# 공유 확인
print(Student.__dict__)
print()
print(studt1.__dict__)
# 인스턴스 네임스페이스 없으면 상위에서 검색
# 즉, 동일한 이름으로 변수 생성 가능(인스턴스 검색 후 -> 상위(클래스 변수, 부모 클래스 변수))
del studt2
print(studt1.student_count)
print(Student.student_count)
class RegisterForm(forms.Form):
email = forms.EmailField(
error_messages={
'required' : '이메일을 입력해주세요.'
},
max_length=64, label='이메일'
)
password = forms.CharField(
error_messages={
'required' : '비밀번호를 입력해주세요.'
},
widget=forms.PasswordInput, label='비밀번호'
)
re_password = forms.CharField(
error_messages={
'required' : '비밀번호를 입력해주세요.'
},
widget=forms.PasswordInput, label='비밀번호 확인'
)
def clean(self):
# super()는 메소드 오버라이딩
cleaned_data = super().clean() # 값이 들어있는지 검사한다. 들어잇으면 아래 변수를 할당, 없으면 실패하고 튕군다.
email = cleaned_data.get('email')
password = cleaned_data.get('password')
re_password = cleaned_data.get('re_password')
if password and re_password:
if password != re_password:
self.add_error('password', '비밀번호가 서로 다릅니다.')
self.add_error('re_password', '비밀번호가 서로 다릅니다.')
else:
fcuser = Fcuser(
email=email,
password=make_password(password)
)
fcuser.save()
class LoginForm(forms.Form):
email = forms.EmailField(
error_messages={
'required' : '이메일을 입력해주세요.'
},
max_length=64, label='이메일'
)
password = forms.CharField(
error_messages={
'required' : '비밀번호를 입력해주세요.'
},
widget=forms.PasswordInput, label='비밀번호'
)
def clean(self):
# super()는 메소드 오버라이딩
cleaned_data = super().clean() # 값이 들어있는지 검사한다. 들어잇으면 아래 변수를 할당, 없으면 실패하고 튕군다.
email = cleaned_data.get('email')
password = cleaned_data.get('password')
if email and password:
try:
fcuser = Fcuser.objects.get(email=email)
except Fcuser.DoesNotExist:
self.add_error('email', '아이디가 없습니다.')
return
if not check_password(password, fcuser.password):
self.add_error('password', '비밀번호를 틀렸습니다.')
else:
self.email = fcuser.email
from django.shortcuts import render
from django.views.generic.edit import FormView
from .forms import RegisterForm, LoginForm
# Create your views here.
def index(request):
return render(request, 'index.html', {'email': request.session.get('user')})
class RegisterView(FormView):
template_name = 'register.html'
form_class = RegisterForm
success_url = '/'
class LoginView(FormView):
template_name = 'login.html'
form_class = LoginForm
success_url = '/'
def form_valid(self, form):
self.request.session['user'] = form.email
return super().form_valid(form)
기존에 로그인 회원가입은 view파트에서 구현을 많이했는데 이번에는 제네릭뷰인FormView 상속 받아서 만들어서 view코드가 깔끔하다.
def form_valid(self, form): 이 함수에서
return super().form_valid(form)이 부분을 이해하느라 애먹었다. super()는 부모클래스에서 가져오는 것이다.
유효한 폼데이터가 POST 요청되었을 때 form_valid 메소드가 호출된다. form_valid는 단순히 success_url로의 연결을 수행한다.
self.request.session['user'] = form.email는 세션에 key:'user'값을 form.email(로그인한 계정의 이메일)로 지정한다.
아직까지 장고가 어떻게 이루어졌는지(상속받는 클래스가 어떻게 이루어졌는지) 잘 모르겠다. 로그인 로그아웃을 구현하는 방법도 너무 많고 어떨 때 어떤 걸 써야하는지 잘 모르겠다.
반복하면서 계속 익혀봐야겠다. 또 상속하는 클래스도 뜯어보고 파이썬 심화도 집중해서 들어야겠다.