퓨어장고 2주차 까지 들었다. 알고리즘 열심히 풀고 있다.

map : 리스트의 요소를 지정된 함수로 처리해주는 함수. 원본 리스트를 변경하지 않고 새로운 리스트를 만든다. list(map(함수,리스트))
주민번호 = "950318-1163417"
a = 주민번호.split("-")
a = "".join(a)[:-1]
a = list(map(int,a))
b = 2,3,4,5,6,7,8,9,2,3,4,5
c = list(zip(a,b))
result = sum([x*y for x,y in c]) % 11
last = 11 - result
주민끝 = 주민번호[-1]
print(last)
if int(주민끝) == last:
    print('유효 주민번호')
else:
    print('유효하지 않는 주민번호')
슬라이싱의 오프셋을 잘 기억하자.
배수 구하기 : 나눴을 때 0 이라면 어떤 수의 배수다.
swapcase(): 대소문자를 바꿔주는 함수
range의 시작 디폴트 값은 0이다. 0에서 커진다.
비어 있는 리스트, 0인 변수 들을 잘 활용하자.
range의 번호를 인덱싱으로 활용 할 수 있다.

퓨어 장고 때 공부 방법이 잘 못되어서 머리에 남은게 없어서 다시 보기 시작. 알고리즘도 조금씩 나아지고 있는 듯 하다. 영어 공부 많이 해서 공식문서 잘 이해하면 좋을 것 같다.

  • 별 표현식 : 패킹과 언패킹을 할 수 있다.
  • 패킹 = 변수와 인자의 수가 달라도 패킹으로 리스트를 만들 수 있다.
  • 언패킹 = 리스트의 요소를 하나씩 꺼내어 준다.
  • 프린트를 잊지 말자.
  • 딕셔너리에 여러 원소를 추가할 때 꼭 하나씩 키 밸류를 다 적어줘야하는 방법 밖에 없나? 딕셔너리를 만들어서 update를 사용하면 된다.
  • 딕셔너리 안에  리스트나, 튜플을 만들 수 있다.
  • 딕셔너리 추가 : update로 할 수 있다.
  • zip :  두 리스트를 묶어준다. 0과 0, 1과 1 .... iterable로 출력이 가능하다.
  • >= : 순서를 기억하자. 자꾸 틀린다.
  • if True : if True는 디폴트다.
  • endswith 사용법 :  변수.endswith(접미사,시작 인덱스,끝인덱스)
fruit = {"봄" : "딸기", "여름" : "토마토", "가을" : "사과"}
a = input()
if a in fruit:
    print('정답')
else:
    print('오답')
#이런 상황에서 분기문에서 fruit의 디폴트 값은 키에서 찾는다.
  • islower() : 소문자인지 대문자인지 불리언으로 리턴 한다.
  • 딕셔너리[이름] : 이렇게 적으면 이름의 vlaue가 호출 된다.
  • 슬라이스의 범위 : 슬라이스는 [:3]이면 3 전까지 출력이 되는 걸 기억하자.
  • 알고리즘을 짤 때 편한 방법이 있는지 한번 더 생각을 하자.
  • 숫자 분기문 : 분기문을 사용할 때 숫자라도 문자인지 숫자인지 잘 파악하자.

알고리즘 풀면서 잘 안되었던 부분은 따로 정리를 하였다. 나는 왠지 개발자가 못 될 것 같다.

자신감이 뚝뚝.. 눈물도 뚝뚝.. 

 

개인과제 어느정도 해놓고 알고리즘 했는데 개인과제 더 보강할 수 있을 것 같아서 건드리고 있다.

완료가 true가 되면 완료 시간이 저장이 되도록 만들고 싶은데 전에는 true로 하면 시간이 저장 되지만 True로 하면 시간 저장이 안되는 에러가 발생했다. 일단 해보자.

  1. sep : print에서 콤마로 구분된 것들을 sep로 어떤 것으로 구분할지 고를 수 있다.
  2. ; : 한줄에 여러 명령어를 작성 할 수 있다.
  3. 바인딩 : 할당 하는 것을 의미.
  4. 매핑 : 메모리상 참조할 주소와 연결 되는 것을 의미.
  5. 슬라이싱 : 특정 부분과 특정 부분을 자를 수 있다.
  6. 문자열 오프셋 : 증가폭을 지정 할 수 있다.
  7. 문자열 수정 : 수정 할 수 없다.
  8. 문자열 포매팅 : %s %d %f 문자열 내 특정 값을 바꿔야 할 경우 사용.
  9. capitalize : 알파벳의 첫 글자를 대문자로 변경.
  10. endswith(접미사[, start [,end]]) : 접미사를 검색 할 수 있다. 튜플러 여러개를 검색 할 수 있다.
  11. startswith : 접두사를 검색. 옵션은 endswith과 같다.
  12. split의 디폴트 값 : 공백.
  13. insert(a,b) : 삽입. a위치에 b를 삽입. 리스트에 사용.
  14. del과 remove의 차이: del은 인덱싱을 이용해 삭제.
  15. 리스트와 리스트 더하기 : 리스트와 리스트를 더하면 새로운 리스트가 생김.
  16. print 하나에 여러개 출력하기: 콤마로 여러개 출력 할 수 있다
  17. count와 len의 차이 : count는 특정 원소를 세고, len은 길이를 센다. 모든 원소를 센다.
  18. 리스트의 평균을 구하는 함수는 따로 없고 직접 알고리즘을 만들어야한다.
  19. '구분자'.join(리스트):  리스트를 무엇으로 연결할지 정 할 수 있다. 문자열이 된다.
  20. split의 결과물 : 리스트로 나타나게 된다.
  21. 괄호 없는 정수는 튜플이다.
  22. range 함수 : 반복문에서만 쓰는게 아냐. 시작,끝,증가폭 을 정할 수 있다.
  23. 참조 : 외래키를 가지고 있고 그 외래키에 접근 한다면 참조.
  24. 역참조 : 외래키를 상대가 가지고 있고 그것에  접근 한다면 역참조.
normalize_email은 이메일의 도메인을 소문자로 바꿔주는 역할을 한다.
validated_data : 유효성 검증된 데이터만 받는다.
 
비번 수정하고 암호화 하고 저장하기
update 를 사용하는 방법을 알게 되었다.
def update(self, instance, validated_data):
        instance.password = validated_data.get('password', instance.password)
        password = instance.password
        instance.set_password(password)
        instance.save()
        return instance
 
삭제를 구현하고 있는데 자꾸 찾을 수 없다는 에러가 발생!
user = get_object_or_404(User, user_id) 라고적었다...
id = user_id라고 적어야하는데.. 으이그..
삭제도 구현 했다!
 
django.db.utils.IntegrityError: NOT NULL constraint failed:
blank=True, null=True 해줬는데도 에러남.
마이그레잇, 마이그레이션 안해서 에러남..
 
TypeError: UpdateTodo.put() got an unexpected keyword argument 'todo'
에러남.
url에서 게시글의 아이디를 지정할 때 todo라고 하고 view에서는 todo_id로 함..
 
django.core.exceptions.ImproperlyConfigured: Field name `title, is_complete` is not valid for model `Todo`.
에러남.. 필드를 `title, is_complete`이렇게 적음.
("title", "is_complete",) 로 고쳐줌.
 
내일부터 할 것은 완료시간을 현재 시간으로 넣을 수 있도록 바꿔줘야한다.
지금의 생각은 is_complete가 true가 되었을때 같이 바꿔줘야하는데 어떻게 해야할지 모르겠다.
그리고 updated_at도 수정을 하지 않는 이상 안나오도록 할 수 있을까?
그리고 삭제를 구현하자.
그리고 모델의 필드를 추가해야하고,
추가는 하지말고 부족한 공부를 어여 끝내도록 하자.

 

학습법 특강 내용.

  • 코드 한 줄 한 줄 어떤 의미인지 주석을 단다.
  • 회사에서 필요로 하는 역량을 미리 파악하고 그것을 최종 프로젝트에 녹여 내는 게 중요.
  • 어떤 기능을 사용 할 줄 아느냐 보다 문제가 있었을 때 어떻게 해결 했는지가 중요하다.
  • 테스트 코드 관련하여 검색 해보고 공부하기. (나중에 커리큘럼 하면서 배우게 됌.)
  • 내가 쓰는 툴을 깊게 이해하면 깊은 인사이트를 얻을 수 있다. 파이썬, 네트워크, 데이터베이스 등등
  • 개념을 이해하기 보다는 체화 시켜서 도구를 사용 할 줄 아는게 더 급선무다. 하지만 개념도 무척 중요.
  • 강의 보고 배운 것을 따라하면 그것만 할 줄 알게 된다. 공식 문서를 보고 조합하면서 코드를 짜야 실력이 향상된다.
  • 코드 짜는 것에 익숙해지려면 알고리즘 푸는 방법이 제일 좋다.

주석을 하나 하나 달면서 어떤 의미있지 스스로 확인하는 방법이 무척 좋은 방법이라고 생각이 들었다.

그리고 알고리즘 정말 많이 풀고 싶은데 일단 지금 장고가 너무 급하다... 조만간 내가 찾아갈게.. 기다려 리즘아...

 

그리고 장고가 스스로 너무 부족하다고 판단하여 점프 투 장고를 보면서 정리를 하고 있다.

startapp, include, urls, views, migrate, makemigration, 모델, 하드코딩, 네임스페이스, form, static 등등

열심히 가보자.

매핑(mapping)이란 하나의 값을 다른 값으로 대응

패키지

장고 프로젝트를 만들면 루트 패키지가 되어지고,

프로젝트 내에 만드는 앱들은 서브 패키지가 된다.

 

장고의 MVT패턴

url을 만든다.

함수로

view와 연결해서 어떤 서비스를 해줄지 작성한다.

데이터를 저장해야 한다면 Model을 작성해서 틀을 정한다.

그리고 DB에 저장하고 클라이언트에게 화면을 보여준다.

from django.contrib

이런 식으로 사용하는 것들은 모두 앱이다. setting에 적어서 사용해야한다.

그리고 manage.py migrate로 알려줘야한다.

 

django-admin startapp <이름>

장고에 app을 만들 수 있다. 그리고 당연히 setting에 적어줘야한다.

쿼리셋(QuerySet)

쿼리셋(QuerySet)은 전달받은 모델의 객체 목록입니다. 쿼리셋은 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있습니다.
= 아 뭔지 알겠다. 모델의 class대로 만들어진 데이터들을 말하는 거구나.

 

개인과제 오류!

product.html에서 action을 알아 듣게 해야함.

action은 url을 알아먹는다. 나는 product를 불러올 url을 공백으로 뒀다. 그래야 메인화면에 불러오니까...
하지만 home이라는 함수를 만들어서 만약 로그인 했다면 product url을 불러오고 아니라면 signup url을 불러오도록
수정을 해서 해결을 했다.! 가보자고!!

 

사이즈를 알아먹게 해야하는데왜 select에서못알아먹는거지?... value도 줬는데...
일단! 넘어가고! 입출고 구현을 해보자!
 
입출고 모델링을 해보자.
입고면 수량에 +를 해야하고,
출고면 수량에 -를 해줘야함.
.........
옼케 이해했어.
똑같이 모델을 만들고 출고면 전체 수량에 -만 해주면 됌.
해보자!
 
나는 그저... 강의 자료를 복붙하고 입맛에 맞춰 고쳐 쓰고 있을 뿐이야....
너는 전혀 스윙을 하고 있지 않아.
교수님의 말이 떠오르는 군...
git 특강 듣고, 점심 먹고, 과제 쪼금 하다가 저녁 먹고 7시에 강당가고.. 지금이다.
도데체  장고 강의에서 내가 배운 것은 뭐지?.. 강의가 그냥 막막하기만 하다.
주변 팀원 몇몇은 이미 끝낸 분도 계신다.
포기할까 생각이 든다.
공부 방법이 잘 못 된걸까?
열심히 노력했나 물어보면 맞다고 말 못할 것 같다.
무작정 열심히 하는 것도 도움이 안될것 같고..
짜증과 속상함과 막막함이 밀려온다. 복잡하고 바보 같다.
 
git diff : wd와 repo를 비교
git diff --staged : 스테이지와 repo 비교
git diff <1커밋> <2커밋> : 커밋끼리 비교.
1커밋에 비해서 2커밋은 뭐가 달라? 라고 물어보는 것.
 
git log --oneline , git log 차이는 한줄이냐 여러줄이냐 차이.
 
작업 되돌리기
revert : 버전을 되돌린 새로운 버전 만들기
안전하게/작업내역 남기고 싶을때 사용.
하지만 불필요한 중복된 커밋이 생김.
 
reset : 버전을 완전히 되돌리기
유의미한 커밋만 남기고 싶을때 .
soft : 리포에 커밋한 것만 되돌리는것.
mixed : 스테이지로 추가한 것을 되돌린다.
hard : 작업 디렉토리  변경사항도 되돌린다.
 
git stash(임시저장)

 

작업 내용을 임시 저장하고 최근 커밋으로 돌아간다.
git stash -, "메세지" : 메세지를 남길 수 있다.
git stash list
stash@{숫자}
숫자 == 최근에 임시저장 되었을 수록 0에 가깝다
git stash apply stash{0}
git stash drop @{0} - 임시저장 삭제

장고의 일하는 방식. 이거 엄청 중요.

urls에서는 url 설정과 설정한 url에서 보여줄 html을 연결할 수 있다.

view에서는 url에서 연결한 html을 리턴하도록 함수를 선언할 수 있다.

post방식으로 회원가입이나 로그인 시의 데이터가 들어오는 것도 view에서 받는다.

모델은 회원가입시 어떤 정보들을 저장할지 정한 형식이다.

 

앱 만들기

터미널에 입력하면 각각의 이름으로 기능을 추가 할 수 있도록 폴더와 파일이 만들어진다.

django-admin startapp user #사용자 관리 담당할 user
django-admin startapp tweet #글 관리 담당할 tweet
 
settings.py에서 installed_apps에 꼭 앱의 이름을 추가 해줘야 한다.
 

 

모델 만들기

각 앱에서 사용할 모델들을 만들고 장고에 알려줘야 한다.

python manage.py makemigrations

그리고 데이터베이스에 반영!

python manage.py migrate

 

회원가입 기능

사용자 데이터 post로 요청.

html에서 입력하는 요소들이 post방식으로 전해져 db에 저장할 수 있도록

보안,설정들을 해주고...

사용자 데이터를 db에 저장

post로 온 각각의 데이터를 저장 할 수 있도록 설정을 해줘야한다.

중복 아이디 검사

filter(username=username) 으로 모델에 있는 아이디가 같은 값을 찾아오면 된다.

 

로그인 기능

사용자 데이터 post로 요청

입력한 아이디와 비밀번호를 post로 받아와서...

사용자 데이터 db에서 확인

아이디, 비밀번호를 검증하고 세션에 저장해주면 된다.

 

 

 

매일 공부한 내용 정리한 걸 TIL로 제출했는데 이제는 TIL에 한번 더 정리해서 한번 더 복습을 하도록 하자.

그리고 오늘 처음 장고를 시작했는데, 첫째주만 공부해서 그냥 장고가 어떤 것이다 정도만 이해했다.

 

장고와 플라스크

장고는 플라스크랑 다르게 많은 기능이 이미 구현되어있어서 그걸 이용해서 웹 페이지를 만들 수 있는 아주 좋은 웹 프레임워크라는 것.

 

인코딩 에러

그리고 장고 실행시 인코딩 오류가 났는데 설정에서 콘솔 인코딩과 파일 인코딩을 UTF-8로 바꾸어주면 에러를 해결 할 수 있다.

 

[ ] vs get

대괄호를 통해 딕셔너리 키 값을 인덱싱해서 밸류를 가져오는 경우와

get으로 가져오는 경우는 전자는 키 값이 없을 때 에러가 나지만 후자는 None을 출력한다는 것.

 

그리고 현직 개발자분의 특강도 있었다.

관한 내용은 특강에 글을 남겼다.

중요한것은 메타인지와 본인의 성장이었다.

가장 나에게 필요했던 것은 악에 받친 감정으로 뭐든지 해내고 말겠다는 마음이 가장 필요하지 않나..

'TIL' 카테고리의 다른 글

[18일차] TIL : 오늘 뭘 했나...  (0) 2023.04.06
[17일차] TIL : 장고 1주차 2주차  (0) 2023.04.05
파이썬 개인과제 해설 정리.  (0) 2023.04.01
TIL super() , return  (0) 2023.03.29
[5일차] TIL : TIL 작성 잘 해야 크게 간다!  (0) 2023.03.17
  • 상속 받지 않을 클래스는 괄호가 없어도 괜찮다.
  • 클래스를 만들기 전에 상속 시켜줄 공통 부분을 생각한 후 만들어야 한다.
  • 프로젝트를 진행하면서 코드를 하나씩 짜면서 진행하는게 아니라 큰 틀을 잡고 주석으로 설명을 넣으면서 큰 단위에서 작은 단위로 코딩을 한다.
  • 들여쓰기가 정말 중요하다.
  • 휴먼에러를 줄일  수 있는 방향으로 코드를 짠다.
  • 예약어나 함수랑 변수의 이름이 같지 않게 만들어줘야한다. 굳이 해야겠다면 _언더바로 구분을 해주자.
enumerate 문법
b = {i:x for i, x in enumerate(a)}
딕셔너리 형태로 반복문이 출력.
player = Player(player_name, 100, 100, 100, 100)
monster_select = int(input('몬스터 선택해주세요'))
monster_list = [
Monster('주니어바록', 100, 10),
Monster('바록', 100, 10),
Monster('주니', 100, 10),
]
monster_dict = {i: x for i, x in enumerate(monster_list, 1)}
monster = monster_dict[monster_select]
위에 방법처럼 할 필요 없이 딕셔너리로 잘 선언해준다면
monster_select = input()
if monster_select in monster_dict.keys():
monsger = monster_dict[monster_select]
로 짤고 몬스터 편하게 만들 수 있다.
 
input은 기본적으로 문자열로 출력이된다. int로 바꿔줘야 알아먹는다. 딕셔너리의 1이 int니까.
def action1():
print("action1")
def action2():
print("action2")
2
a = {
1: action1,
2: action2,
}
user_input = int(input())
a[user_input]()
딕셔너리 키 밸류 출력하기.
print(a.value()) 키 값만 출력
print(a.keys()) 밸류 값만 출력
print(a.items()) 키, 밸류값 출력
rich : 터미널 출력을 예쁘게 해주는 기능
logging : 소프트웨어가 실행 될 때 발생하는 이벤트를 추적하는 수단.
리치와 로깅을 같이 쓰면 더 예쁘게 출력 된다. 이 정도 까지만.
 
other.hp = max(other.hp - damage, 0)
이것의 뜻은 other의 hp는 other의 hp에서 damage를 뺀 값과 0이 최대라는 뜻이다. 음수로 떨어지지 않는다. 이게 더 안전한 방법이라고 한다. hp가 음수일 때 의도치 않는 결과가 나올 수 있기 때문이라고 한다.

Validation(밸리데이션) : 입력된 데이터가 유효한 데이터인지 검증하는 것을 말한다.

+ Recent posts