AI 웹개발반

[TIL] 장고 숙제 해결하기 + 공부한 것 정리

째깍단 2023. 4. 4. 21:22

장고 숙제 :

(1)회원가입 시 사용자 이름 확인해주기

(2)로그인 성공시 사용자 이름 띄워주기

 

 

 

(1) 회원가입 시 사용자 이름 확인해주기

 

  문제 고민  

새 이름을 확인하는 과정에도 데이터베이스의 username들이 필요하다.

다만 가져와서 일일이 대조할 필요는 없긴하지만.. 일단 써보자!

 

 

과정 1.

signin 할때 함께 써보았던 objects.get()을 들고왔다.(생각좀)

 

name_check = UserModel.objects.get(username=username)

if username == name_check.username: #입력받은 것과 데이터이름이 같으면 warning message
	messages.warning(request, "이미 있는 이름입니다.")
	return render(request, 'user/signup.html')
else:
	messages.warning(request, "사용가능한 이름입니다.")

 

이렇게 작성했을 경우 데이터가 없는데 가져와달라고 요청하는 관계로.. 오류가 난다.

 

 

과정 2. 답안코드를 참고해 다시 작성해보자..

 

- 자리옮기기

else문, password1, 2가 서로 확인이 된 경우에 가져다 놓는다.

 

- 함수 바꾸기    **함수 응용**

filter함수를 사용해 사용자가 넣은 객체가 데이터내에 있는지 훑어보도록 한다..! 

 

name_check = UserModel.objects.filter(username=username)
	if name_check : #입력받은 것과 데이터이름이 같으면 warning message
	messages.warning(request, "이미 있는 이름입니다.")
else: #일치하는 것이 없으면 가입 완료!
	#new_user 정보 저장해줘야함
	return render(request, 'user/signin.html')

 

 

 

  알게된 것  

1. 어떤 문제든 좀더 깊게 고민하는 습관을 가지자.

   아는 함수여서 생각을 더 했다면 혼자서도 풀 수 있지 않았을까? 아쉬움이 든다

 

 

2. alert 기능을 사용해보려고 찾아보고 있었는데 장고 기본 기능으로 message를 띄워줄 수 있음을 알게 되었다.

   js로 띄우는 시간도 조절할 수 있는 듯 하다.

 

#message 기능 사용을 위해 request받을 view 코드에 추가
from django.contrib import messages

def some_function(request):
	messages.warning(request, "메시지 내용~")
#html템플릿의 적절한 위치에 넣어주기
{% for message in messages %}
{{ message.tag }} #메세지 레벨(꾸미는데 사용하기 위해 작성됨)
{{ message }} #메세지 내용
{% endfor %}

 

 


 

 

(2) 로그인 성공시 사용자 이름 띄워주기

 

이왕 me를 선언해 데이터를 가져왔으니 f스트링으로 넣었다

return HttpResponse(f'{me.username} 로그인 성공!')

 

느낀 점:

이렇게 깔끔하게 어떻게할지 생각나고 잘 해낸 나 자신을 보면 힘이나.. 계속할 수 있어..

 

 

 

 


 

 

 

- Today's 오류메세지 01 -

** ImportError: attempted relative import with no known parent package

urls.py에서 터미널 실행을 하면 볼 수 있다.

 

원인은 from . import views 여기에 있는데,

터미널에서 python파일을 직접 실행시킬때, __name__ == '__main__' 이 되면서

상대경로로 설정된 모듈의 위치를 파이썬 interpreter는 알 수가 없기 때문에 에러가 발생한다.

 

그러니까 실행을 아무 py파일에서 했기때문에 생긴 오류인 것.

html 파일에서 라이브서버를 열자 cmd+L cmd+O

 

 

+ 추가 공부,   '_' 언더스코어(생성자에 붙어있던 것)

 

__name__ 변수는 파이썬 모듈의 이름을 나타내는 내장 변수

__main__은 파이썬 인터프리터에서 직접 실행되는 모듈의 이름

즉, if __name__ == '__main__':은 현재 모듈이 직접 실행되는 경우에만 해당 블록의 코드를 실행하라는 조건문

 

EX) 모듈 A에서 import 모듈 B 했을 때, 모듈 B의 __name__ 변수 값은 "B" (=모듈 A에서 본 값)

그러나 모듈 B를 직접 실행할 때에는 __name__ 변수 값이 "__main__"이 된다. (=모듈 B에서 본 값이 __main__)

 

if __name__ == '__main__': 코드 블록은 현재 모듈이 직접 실행되는 경우에만 실행되는데,

이 코드 블록 안에 있는 코드들은 모듈이 다른 모듈에서 임포트될 때는 실행되지 않습니다.

 

 

 

- Today's 오류메세지 02 -

** 다 만들고 되나 실행해보는데 오류메시지^.^ 안녕?

You’re seeing this error because you have DEBUG = True in your Django settings file.

Change that to False, and Django will display a standard page generated by the handler for this status code.

 

그러니까... DEBUG가 켜져있어서 이 오류창을 보고있다고? ㅇㅋ..

 

앗. 하지만 디버그 기능을 끄면 실행이 아예 안돼서 페이지 로딩을 할 수가 없다;

그러니까 이 메세지에 속지말고 다른 문제를 찾아 노란경고창을 앞 쪽을 헤메면 해결이 가능하다..

 

 

서버를 실행해뒀는데, 파일을 벗어난 곳에서 실행하고 있었던 듯 + 코드에 약간의 오타ㅠㅠ

 

오류가 난 코드를 수정하고 종료 후 다시 실행했더니 정상 작동하였다.

 

 

 

 

<장고! 정보 정리>

 

ForeignKey 다른 db에서 내용을 가져오겠다

CharField 문자(character) 필드

DataTimeField 날짜, 시간 필드

 

 

 

어제 받은 숙제: TEMPLATES 알아보기

 

'BACKEND': 'django.template.backends.django.DjangoTemplates',
#장고 템플릿 시스템을 사용하도록 지정!

'DIRS': [BASE_DIR / 'templates],
#튜터님이 추가하라고 주신 코드, 템플릿 파일의 경로를 지정해준다. BASE_DIR/templates 디렉토리에서 템플릿 파일을 찾도록 지정

'APP_DIRS': True,
#각 Django 앱의 templates 디렉토리에서도 템플릿 파일을 찾도록 지정해준다.


'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
]}
#컨텍스트 프로세서를 지정한다... 기능들을 가지고 있는 듯
#디버그, 요청처리, 인증된 사용자 정보 데이터에, message의 기본 기능이있다

 

컨텍스트 프로세서 = 각각의 템플릿에 요청마다 컨텍스트 dict를 반환해주고,

 반환 값이 템플릿에서 사용할  있는 추가 데이터를 제공하게 된다. 말그대로 option이네!