Django Tutorial 02. MTV
by academey
0. 들어가며
Fast campus 의 파이썬 웹 개발 올인원 패키지 강좌를 학습하며 정리한 글입니다. 글 내용 중 문제가 있거나 문의하실 내용이 있으면 댓글을 남겨주세요!
2. MTV
- MTV의 M 만들기 - 회원
- 모델의 필드를 설정하고, verbose_name 으로 admin에서 보여지는 네이밍을 설정할 수 있다.
- auto_now_add 라는 옵션을 통해 저장되는 시점이 자동으로 넣어진다.
- 테이블 명을 지정하고 싶으면 class Meta: 를 만들어서 설정해줄 수 있다. ```python from django.db import models
class Fcuser(models.Model): username = models.CharField(max_length=64, verbose_name=’사용자명’) password = models.CharField(max_length=64, verbose_name=’비밀번호’) registered_dttm = models.DateTimeField(auto_now_add=True, verbose_name=’등록시간’)
class Meta: db_table = 'fastcampus_fcuser' ```
- 데이터베이스 관리
- 만든 모델을 마이그레이션 해준다.
python3 [manage.py](http://manage.py) makemigrations
- 그러면 migrations/0001_initial.py 가 생성되는데, 디비에 들어가는 설정들이 만들어진다.
python3 [manage.py](http://manage.py) migrate
를 실행하면 등록된 앱들의 모델들을 테이블로 만들어준다. 그러면 db.sqlite3 파일이 생기는데 요게 디비 파일이다.- 생성된 디비를 확인하고 싶으면
sqlite3 db.sqlite3
을 통해서 접근하자. 그리고.tables
를 치면 fastcampus_fcuser 가 생성된 걸 확인할 수 있다. - 즉, 모델을 변경하고 마이그레이션 하면 알아서 변경점을 디비에 업데이트 시켜준다. 모델을 변경하고 다시 makemigrations 실행하고, migrate 를 실행하면 디비에 반영된다.
- 만든 모델을 마이그레이션 해준다.
- Admin 소개
- 메인 프로젝트의 urls.py 을 보면 아래처럼 admin 이 기본으로 들어가 있다. admin 안에 여러 url이 정의되어 있어서, 저 하위의 path 로 접근하면 admin.site.urls, 하위의 url 패턴을 따라 간다는 의미다. ```python from django.contrib import admin from django.urls import path
urlpatterns = [ path(‘admin/’, admin.site.urls), ] ```
- 들어가보려면 우선 장고를 띄워보자.
python3 [manage.py](http://manage.py/) runserver
**을 하고 127.0.0.1:8000/admin 으로 접근해보자. 그러면 계정이 필요한데 아이디가 없다.python3 manage.py createsuperuser
를 하면 계정을 만들 수 있다.
- Admin 활용
- 장고 어드민에 우리가 만든 모델들을 등록해보자. fcuser/admin.py 에서 우리가 관리할 모델들을 등록할 수 있다. admin.py 에다가 다음과 같이 작성하면, 해당 모델을 CRUD 할 수 있는 페이지가 나온다. ```python from django.contrib import admin from .models import Fcuser
class FcuserAdmin(admin.ModelAdmin): pass
admin.site.register(Fcuser, FcuserAdmin)
2. 그런데 요렇게 하면, Fcuser object(1) 이라고 나오고 영문으로 나와서 불편하다. 바꿔보자. 3. 모델에 def __str__(self): return self.username 을 하면 admin 에서 유저 이름으로 표기 된다. 4. 그리고 [models.py](http://admin.py) 에 아래 코드를 추가해준다. ```python class Fcuser(models.Model): def __str__(self): # 객체 자체를 표기할 때 username으로 사용 return self.username class Meta: # table 이름과 admin 표기 이름들을 명시 db_table = 'fastcampus_fcuser' verbose_name = '패스트캠퍼스 사용자' verbose_name_plural = '패스트캠퍼스 사용자들'
- MTV의 T, V 만들기 - 회원가입 1
- 우선 fc_user/templates/register.html 을 만들고 head 태그에 bootstrap 링크를 다 박아준다.
- 템플릿을 만들었으니 뷰를 만들어보자. fcuser/views.py 에 다음과 같이 추가한다.
def register(request): return render(request, 'register.html') # 이 파일의 경로는 templates 을 보고 있으니 거기서 관리하면 될듯
- 그리고 route 를 연결해줘야 하므로 fc_community/urls.py 에 다음과 같이 추가한다. ```python from django.contrib import admin from django.urls import path, include
urlpatterns = [ path(‘admin/’, admin.site.urls), path(‘fcuser/’, include(‘fcuser.urls’)) ]
4. 그리고 route 를 연결해줘야 하므로 fc_community/urls.py 에 다음과 같이 추가한다. ```python from django.urls import path from . import views urlpatterns = [ path('register/', views.register) ]
그러면 fcuser/register 에 해당 메소드를 리턴할 것이다.
- MTV의 T, V 만들기 - 회원가입 2
- 폼 설정을 해주자. form method=”POST” action=”.” (현재 url 에 전송한다) 그리고 폼 내부에 {% csrf_token %} 을 써줘야 폼 액션에서 해킹에 안전할 수 있다.
- 그러면 이제 GET 방식과 POST 방식 둘 다 /register 에서 받고 있기 때문에 추가적으로 메소드를 만들어주고 연결해줘야 한다. 아래처럼 Fcuser.save() 를 통해 객체가 만들어짐을 확인할 수 있다.
from django.shortcuts import render from .models import Fcuser # Create your views here. def register(request): if request.method == 'GET': return render(request, 'register.html') # 이 파일의 경로는 templates 을 보고 있으니 거기서 있으면 연결해준다. if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] re_password = request.POST['re-password'] fcuser = Fcuser( username=username, password=password ) fcuser.save() return render(request, 'register.html')
- 비밀번호가 같은지 아닌지 데이터를 templates 으로 넘겨주자. 그리고 make_password 를 이용해서 비밀번호를 암호화시켜 저장하자. 그리고 인풋값에 대한 예외처리도 해줘야 한다.
from django.http import HttpResponse from django.shortcuts import render from .models import Fcuser from django.contrib.auth.hashers import make_password # Create your views here. def register(request): if request.method == 'GET': return render(request, 'register.html') # 이 파일의 경로는 templates 을 보고 있으니 거기서 있으면 연결해준다. if request.method == 'POST': username = request.POST.get('username', None) password = request.POST.get('password', None) re_password = request.POST.get('re-password', None) res_data = {} if not (username and password and re_password): res_data['error'] = '모든 값을 입력해야 합니다.' elif password != re_password: res_data['error'] = '비밀번호가 다릅니다' else: fcuser = Fcuser( username=username, password=make_password(password) ) fcuser.save() return render(request, 'register.html', res_data)
- MTV의 T, V 만들기 - 회원에 필드 추가하기
- useremail 을 추가해보자. 모델에 useremail 필드 추가하고 makemigrations 하려는데, 기본값이 필요하다고 한다. 필드에다가 default 옵션을 추가하던지, 그냥 콘솔 창에 추가하던지 둘 중 하나로 기본값을 넣어준다.
- 그리고 템플릿과 뷰단 로직을 추가해준다.
Subscribe via RSS