[Django] MTV patterns (Form, Template 활용) #2

채록·2021년 4월 27일
0

Python & Django

목록 보기
32/34
post-thumbnail

지난번 포스팅의 내용은 models.py views.py forms.pyTemplates file을 통해 회원가입에 필요한 화면을 띄우는것 까지 진행했다. 이번 포스팅에서는 최종적으로 유저를 생성하고 django에서 제공하는 admin 사이트에서 생성된 유저를 확인하는것 & ModelForm을 사용해보는것 까지이다.


I. Form 사용

1. forms.py

django의 form을 사용하는 첫번째 방식이다. forms.Form을 상속받는 class를 만든다.

2. views.py

그리고 나서 이 view를 작성한다.

csrf_exempt ?
자꾸 CSRF error나서 사용해주었다. 토큰관련 정보를 무시하는 기능을 하는것 같다.

코드를 보면 다음과 같다.

  • method가 post일때 forms.py에 작성된 UserForm에 해당 내용을 넘겨 이에 대한 정보를 form이라는 변수에 담는다.
  • django의 form모듈이 제공하는 validation을 통과하면 models.py 에 작성된 User class 폼에 맞게 instance를 생성한다.
  • HttpResponse로 201을 반환한다.
  • validation이 통과되지 않을 경우 UserForm에 아무것도 담지 않는다. 이렇게 되면 빈 form에 대해 랜더링 되어 빈칸으로 표시된다. 즉 GET 메소드 사용시 처럼 그냥 입력창만 뜬다.

3. admin.py

django에서 제공해주는 admin site에 해당 app을 등록해야 한다.

4. httpie test

이부분에서 애를 먹었다. 기존에 하던대로 httpie를 이용해 test 하려니까 validation에 걸려 자꾸 else문으로 빠지더라!!!
그 이유는 기본적으로 httpie는 형식이 form-data 가 아닌 json형태이기 때문이었다.
그래서 postman으로 테스트 하였다.

5. postman test

postmat에서는 request보내는 데이터 형식을 지정할 수 있다.

참고로 Authorization에는 createsuperuser했을때의 정보를 입력해야 한다 (username과 pw)

5. 결과

postman에서는 post 결과 201이 반환되지만 터미널상에서(runserver한 화면)는 post / 200으로 뜬다. 하지만 유저정보는 새로 생성되었다.

HttpResponse

터미널상에서 201로 상태코드를 받고 싶다면 다음과 같이 입력한다.

return HttpResponse(status=201)

이렇게 되면 postman에서는 아무런 결과가 나오지 않지만 터미널에서는 201로 뜬다.

혹은 JsonResponse를 사용해도 된다.

return JsonResponse({"message" : "SUCCESS"}, status=201)

-----------------------------------


II. ModelForm 사용

forms.Form 말고 forms.ModelForm을 사용해 보았다.
이때 애먹었던 부분은 자동으로 값이 입력되지도 않고, default값도 설정 되지 않은 deleted_at field였다.

1. models.py

2. forms.py

원래 fields에 __all__ 로 표기했었는데 그러면 deleted_at 값을 입력해주지 않아 views.py의 validation에서 아웃되더라. 그래서 입력이 필요한 field를 특정지어주었다.

3. views.py

그냥 forms.Form형태를 사용했을땐 view에서 마치 validation은 forms.py의 것을 사용하고, 실제 instance 생성은 models.py의 것을 사용하는 방식이었다. 하지만 forms.ModelForm을 사용하면 view에서 관여하는 것은 forms.py의 로직이고, forms.py에서 models.py의 로직을 참조하는 형식이다.

4. postman test

위에서 말한것 처럼 HttpResponse의 값에 status=201을 작성하니 postman의 결과는 아무것도 출력되지 않고 터미널에서 201이 뜸을 확인할 수 있었다.


-----------------------------------


III. sqlite table 확인

터미널상에서 sqlite의 값을 확인할 수 있다. 이를 위해선 python 내장 패키지로 설치해준다.

pip install pysqlite3

이후 터미널에서 해당 db에 접속한다

sqlite3 [db이름]

1) DB, table 확인

.databases

2) table 스키마(구조)확인

.schema [테이블명]

3) table row 확인

select * from [테이블명];

(test user 생성 이전에 캡쳐한 결과이다.)


-----------------------------------


끝!

Django의 Form을 사용해 동작해 보았다. 이젠 pure Django를 사용해 rendering을 함수화 처리해보자

profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글