프로젝트 구조 만들기
sns기능을 생각하면
사용자 관리(회원가입/로그인/로그아웃)
글쓰기
친구만들기
로 나누어 볼 수 있다.
크게 사용자와 글쓰기로 나누어 볼 수 있고 관련된 앱을 만든다.
터미널에 입력한다.
django-admin startapp user #사용자 관리 담당할 user
django-admin startapp tweet #글 관리 담당할 tweet
user, tweet이라는 앱이 만들어지면서 폴더와 필요한 파일들이 생성된다.
앱이 만들어졌으니 settings.py에서 앱을 사용할 수 있도록 수정 해줘야 한다.
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'tweet', #
'user', # 두개 추가!
]
데이터베이스와 장고 ORM 알아보기
데이터 베이스 연결
장고가 잘 실행되면 데이터베이스가 자동으로 생긴다.
파이참 우측 상단에 있는 데이터베이스를 클릭해서 경로에서 데이터베이스를 찾고 sqlite로 데이터베이스를 연결하고 드라이버를 설치해주면 연결 할 수 있다.
settings.py 밑쪽을 보면 데이터베이스가 생성되도록 적혀져 있다.
ORM
데이터베이스를 객체로 보고 SQL언어가 아닌 클래스로 쉽게 표현, 사용 할 수 있게 해줌. 클래스로 표현한 형태가 모델이다.
유저모델 만들기
유저 모델에 필요한 요소는 무엇일지 고민을 해야한다.
유저이름, 비밀번호, 바이오, 생성일, 수정일을 받기로 정하였다.
메타는 db에 테이블의 이름을 정하고 저장해준다.
각 필드는 어떤 정보가 들어갈 건지 설정할 수 있다.
#user/models.py
from django.db import models
# Create your models here.
class UserModel(models.Model):
class Meta:
db_table = "my_user"
username = models.CharField(max_length=20, null=False)
password = models.CharField(max_length=256, null=False)
bio = models.CharField(max_length=256, default='')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
만든 유저모델 관리자 페이지에 넣기
데이터베이스의 변경을 알려줘야한다.
python manage.py makemigrations
변경된 모델의 이름이 출력이 되면 완료.
데이터베이스에 변경을 반영해야한다.
관련된 이름이 출력되면 완료.
admin 기능 맛보기
/admin 으로 이동하면 관리자 페이지로 갈 수 있다.
관리자로 로그인할 수퍼유저를 만들어야한다.
터미널에 입력!
python manage.py createsuperuser
admin에 모델을 불러와서 모델을 만들고 수정 할 수 있도록 할 수 있다.
user의 admin에 추가한다.
from django.contrib import admin
from .models import UserModel
# Register your models here.
admin.site.register(UserModel) # 이 코드가 나의 UserModel을 Admin에 추가 해 줍니다
tweet모델 관리자 페이지에 넣기
tweet 모델 먼저 만든다.
# tweet/models.py
from django.db import models
from user.models import UserModel
# Create your models here.
class TweetModel(models.Model):
class Meta:
db_table = "tweet"
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
#ForeignKey는 '외부 모델을 가져와서 사용하겠다.' 라는 얘기
content = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
데이터 베이스에 알려주고 적용하기
python manage.py makemigrations
python manage.py migrate
admin에 넣기
from django.contrib import admin
from .models import TweetModel
# Register your models here.
admin.site.register(TweetModel)
로그인 화면 띄우기
base, signup, signin html을 만들고 각각 이어줘야 한다.
sns에 있는 urls.py에는 user.urls에 있는 url들을 연결 시켜줘야 하고
user.urls는 views의 함수와 연결을 해줘야한다.
총 세가지의 작업이 필요.
sns에 있는 urls.py 수정
# mySpartaSns/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('user.urls')) #user앱의 urls.py에 연결시키겠다! 라고 선언 해 주는 코드
]
유저의 views.py 수정
from django.shortcuts import render
# Create your views here.
def sign_up_view(request):
return render(request, 'user/signup.html')
def sign_in_view(request):
return render(request, 'user/signin.html')
유저의 urls.py 수정
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
path('sign-in/', views.sign_in_view, name='sign-in'),
]
회원가입 기능 만들기
페이지 보여주기와 가입정보 입력 후 전송 url은 동일.
보여주는 것은 get방식, 데이터 전송은 post 방식
def sign_up_view(request):
if request.method == 'GET': # GET 메서드로 요청이 들어 올 경우
return render(request, 'user/signup.html')
elif request.method == 'POST': # POST 메서드로 요청이 들어 올 경우
return ""
signup.html에서 회원가입 시 데이터를 전송 할 수 있도록 수정해야함.
<!-- 윗 부분 생략 -->
<div class="wrap">
<h2 class="title-center"> 회원가입 </h2>
<form class="form-area" method="post" action="/sign-up/">
{% csrf_token %}
<div class="form-group mt-2 mb-2">
<label for="username">이름</label>
<input type="text" class="form-control" id="username" name="username">
</div>
<div class="form-group mt-2 mb-2">
<!-- 아랫 부분 생략 -->
<form>태그의 가장 마지막에 있는 <button type="submit" class="btn btn-primary">회원가입</button> 버튼은, form태그의 method로 action에 데이터를 보내주는 역할
{% csrf_token %} 은, Django에서 post 할 때에 보안을 위해서 사용
회원가입 하면서 적었던 내용이 이제 post 방식으로 오게 되고, 그걸 db에 저장해야한다.
from django.shortcuts import render, redirect
from .models import UserModel
def sign_up_view(request):
if request.method == 'GET':
return render(request, 'user/signup.html')
elif request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
password2 = request.POST.get('password2', None)
bio = request.POST.get('bio', None)
if password != password2:
return render(request, 'user/signup.html')
else:
new_user = UserModel() #나는 괄호를 빼먹어서 에러가 났다. 조심하자.
new_user.username = username
new_user.password = password
new_user.bio = bio
new_user.save()
return redirect('/sign-in')
로그인 기능 만들기
user.views에 POST를 추가하자.
# user/views.py
from django.http import HttpResponse
def sign_in_view(request):
if request.method == 'POST':
return HttpResponse("로그인 성공!")
elif request.method == 'GET':
return render(request, 'user/signin.html')
form태그에 method, action 추가하기.
아이디와 비밀번호 정보를 보내야 하기 때문.
<!-- 윗부분 생략 -->
<div class="wrap">
<h2 class="title-center"> 로그인</h2>
<form class="form-area" action="/sign-in/" method="post">
{% csrf_token %}
<div class="form-group mt-2 mb-2">
<!-- 아랫 부분 생략 -->
user.views에서 아이디와 비밀번호의 정보가 일치하는 유저가 있는지 확인
# user/views.py
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
return HttpResponse("로그인 성공!")
elif request.method == 'GET':
return render(request, 'user/signin.html')
# user/views.py
def sign_in_view(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
me = UserModel.objects.get(username=username) # 사용자 불러오기
if me.password == password: # 저장된 사용자의 패스워드와 입력받은 패스워드 비교
request.session['user'] = me.username # 세션에 사용자 이름 저장
return HttpResponse("로그인 성공!")
else: # 로그인이 실패하면 다시 로그인 페이지를 보여주기
return redirect('/sign-in')
elif request.method == 'GET':
return render(request, 'user/signin.html')
숙제 1: 아이디가 중복이라면 가입이 안되도록 코드 수정.
이거는 몰라서 바로 답안을 봤다. 필터를 배워야한다.
filter(조건 함수, 순회 가능한 데이터)
filter() 함수는 두번째 인자로 넘어온 데이터 중에서 첫번째 인자로 넘어온 조건 함수를 만족하는 데이터만을 반환합니다.
filter(조건 함수, 순회 가능한 데이터)
filter() 함수는 두번째 인자로 넘어온 데이터 중에서 첫번째 인자로 넘어온 조건 함수를 만족하는 데이터만을 반환합니다.
오오~~ 만약 조건 함수가 가입 시 id라면 순회 가능한 데이터가 모델의 id들로 한다면 중복을 찾아 낼 수 있겠구나!
숙제 2 : 로그인 시 로그인 id출력.
return HttpResponse(f"안녕하세요{username}님. 로그인 되었습니다.")
이거는 너무 쉬웠구.