지난번 포스팅의 내용은 models.py
views.py
forms.py
와 Templates
file을 통해 회원가입에 필요한 화면을 띄우는것 까지 진행했다. 이번 포스팅에서는 최종적으로 유저를 생성하고 django에서 제공하는 admin 사이트에서 생성된 유저를 확인하는것 & ModelForm을 사용해보는것 까지이다.
django의 form을 사용하는 첫번째 방식이다. forms.Form
을 상속받는 class를 만든다.
그리고 나서 이 view를 작성한다.
csrf_exempt ?
자꾸 CSRF error나서 사용해주었다. 토큰관련 정보를 무시하는 기능을 하는것 같다.
코드를 보면 다음과 같다.
UserForm
에 해당 내용을 넘겨 이에 대한 정보를 form이라는 변수에 담는다.User class
폼에 맞게 instance를 생성한다.django에서 제공해주는 admin site에 해당 app을 등록해야 한다.
이부분에서 애를 먹었다. 기존에 하던대로 httpie를 이용해 test 하려니까 validation에 걸려 자꾸 else문으로 빠지더라!!!
그 이유는 기본적으로 httpie는 형식이 form-data 가 아닌 json형태이기 때문이었다.
그래서 postman으로 테스트 하였다.
postmat에서는 request보내는 데이터 형식을 지정할 수 있다.
참고로 Authorization에는 createsuperuser
했을때의 정보를 입력해야 한다 (username과 pw)
postman에서는 post 결과 201이 반환되지만 터미널상에서(runserver한 화면)는 post / 200으로 뜬다. 하지만 유저정보는 새로 생성되었다.
터미널상에서 201로 상태코드를 받고 싶다면 다음과 같이 입력한다.
return HttpResponse(status=201)
이렇게 되면 postman에서는 아무런 결과가 나오지 않지만 터미널에서는 201로 뜬다.
혹은 JsonResponse를 사용해도 된다.
return JsonResponse({"message" : "SUCCESS"}, status=201)
forms.Form 말고 forms.ModelForm을 사용해 보았다.
이때 애먹었던 부분은 자동으로 값이 입력되지도 않고, default값도 설정 되지 않은 deleted_at
field였다.
원래 fields에 __all__ 로 표기했었는데 그러면 deleted_at
값을 입력해주지 않아 views.py의 validation에서 아웃되더라. 그래서 입력이 필요한 field를 특정지어주었다.
그냥 forms.Form
형태를 사용했을땐 view에서 마치 validation은 forms.py의 것을 사용하고, 실제 instance 생성은 models.py의 것을 사용하는 방식이었다. 하지만 forms.ModelForm을 사용하면 view에서 관여하는 것은 forms.py의 로직이고, forms.py에서 models.py의 로직을 참조하는 형식이다.
위에서 말한것 처럼 HttpResponse
의 값에 status=201
을 작성하니 postman의 결과는 아무것도 출력되지 않고 터미널에서 201이 뜸을 확인할 수 있었다.
터미널상에서 sqlite의 값을 확인할 수 있다. 이를 위해선 python 내장 패키지로 설치해준다.
pip install pysqlite3
이후 터미널에서 해당 db에 접속한다
sqlite3 [db이름]
.databases
.schema [테이블명]
select * from [테이블명];
(test user 생성 이전에 캡쳐한 결과이다.)
Django의 Form을 사용해 동작해 보았다. 이젠 pure Django를 사용해 rendering을 함수화 처리해보자