앱 연결하기
django-admin startapp user
django-admin startapp tweet
INSTALLED_APPS = [
....(기본 제공 기능들)
'user',
'tweet',
]
사용할 앱을 추가한다
데이터베이스와 Django ORM
실행후
db.sqlite3파일이 생성되면 완성
사진과 같이 data source from path 클릭
db.sqlite3 클릭, ok 클릭
드라이버를 SQLite로 연결
필요한 드라이버 자동 설치
test클릭하여 연결에 문제가 없는지 확인
apply > ok 순서대로 클릭하여 창 나오기
데이터베이스를 하나의 객채(Object)덩어리로 본다.
데이터베이스를 SQL언어가 아닌 클래스로 쉽게 표현 및 사용
#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)
문자열 : CharField, TextField
날짜/시간: DateTimeField, DateField, TimeField
숫자 : IntegerField, FloatField
다른 테이블과 연관을 지어 줄 때 : ForeignKey
어떤 형태로 데이터베이스에 들어갈지 설정
장고 서버 종료
터미널 입력
python manage.py makemigrations
python manage.py migrate
다음과 같이 데이터베이스에 등록된걸 확인 할 수 있다.
학습 목표 : 관리자 페이지 접속, 관리자 페이지에 Model 추가
http://127.0.0.1:8000/admin
관리자 페이지 접속
python manage.py createsuperuser
입력후 순서대로
이름과 이메일, 비밀번호 입력
admin페이지 접속
http://127.0.0.1:8000/admin/
users app의 admin.py 접속
from django.contrib import admin
# django에서 admin툴을 사용하겠다는 의미
from .models import UserModel
# 우리가 생성한 모델을 가져오는 것
# Register your models here.
admin.site.register(UserModel)
# 이 코드가 나의 UserModel을 Admin에 추가 해 줍니다
# 관리자 페이지에 입력한다.
models에 제작한 UserModel을 데이터 베이스에 등록하는 과정
학습 목표 : tweet model을 admin페이지에 등록하기
tweet앱의 models.py로 이동
# tweet/models.py
from django.db import models
from user.models import UserModel
# 유저앱에 있는 모델을 가져와서 사용할건데, 그중 이름이 UserModel을 갖고온다.
# Create your models here.
class TweetModel(models.Model):
class Meta:
db_table = "tweet"
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
#ForeingKey : 다른 데이터 베이스에서 내용을 가져온다.
content = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
등록하는 과정
1. 서버 종료
2. 데이터베이스 변경 알림
3. 변경된 데이터베이스 적용
manage.py makemigrations
manage.py migrate
1 - 템플릿 만들기 (HTML작성)
템플릿에 base.html 파일과
user폴더에 singup,singin.html파일 생성
템플릿을 우클릭후 다음과 같이 디렉토리(폴더)를 생성할 수 있다.
{% extends 'base.html' %}
2 - URL - VIEW - TEMPLATE 연결
다시 확인하는 장고의 MVT 패턴
User > URL Conf > View > Model > DB
DB > VIEW > Template > User
user앱에 urls.py 생성
main프로젝트 mySpartaSns의 urls.py에 include
user앱의 views.py
from django.shortcuts import render
# html파일을 화면에 보여주는 헤더파일
# 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')
각각에 맞는 html파일 연결
from django.urls import path
from . import views
urlpatterns = [
path('sign-up/', views.sign_up_view, name='sign-up'),
# sign-up 에 접속하면, views파일의 sign_up_view실행
path('sign-in/', views.sign_in_view, name='sign-in'),
]
path('sign-up/', views.sign_up_view, name='sign-up'),
user앱의 urls파일의, path : singup에 접속을 하면
views파일의 sing_up_view함수를 호출한다.
def sign_up_view(request):
return render(request, 'user/signup.html')
views파일의 sing_up_view함수는 html을 반환하고 있다.
프로젝트 파일의 urls.py의 맞는 url연결,(user앱의 urls파일로 이동)
user앱의 urls.py파일이 views.py에 위치한 sing_in_view 함수 호출
user앱의 views.py파일에 위치한 sing_in_view함수는
템플릿에 위치한 user 디렉토리의 signin.html파일을 반환하고 있다.
template의 user디렉토리의 singin.html파일을 받아온다.
6.사용자에게 html화면을 출력한다.
sing-up 페이지에 post 데이터 전송
GET
데이터를 읽어올때 사용
POST
데이터를 전달하는 과정(저장,수정,삭제)
def sign_up_view(request):
if request.method == 'GET':
return render(request,'user/signup.html')
기능 : 사용자가 url요청을 할때,요청 방식을 참고하여 GET이라면 singup.html화면 전송
elif request.method == 'POST':
# 데이터를 저장하는 기능 만들기!
기능 : 요청방식이 POST라면, 데이터 저장
<form class="form-area" method="POST" action="/sign-up/">
{% csrf_token %}
- form
- 화면에 있는 데이터를 서버로 전송한다.
- method = "POST"
- 데이터 전송 방식을 "POST"형식으로 설정
- action
- sing-up url로 전달된다.
- {% csrf_token %}
- 장고의 내장된 보안기능을 추가하겠다.
동작 순서
1. submit을 통해 from을 실행한다.
<button type="submit" class="btn btn-primary">회원가입</button>
<div class="form-group mt-2 mb-2">
<label for="username">이름</label>
<input type="text" class="form-control" id="username" name="username">
</div>
받아오는 데이터들
username,password,password2,bio
from데이터 에서, post방식으로 sing-up url로 데이터를 전송하는데
이때 장고의 내장된 보안 기능이 포함되어 있다.
view.py에서 동작 실행
def sign_up_view(request):
if GET요청은 생략:
elif request.method == 'POST':
username = request.POST.get('username',None)
#POST의 데이터 username의 데이터를 변수에 반환한다.
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('sing-in')
redirect를 사용하기위해서는 헤더파일이 필요하다
from django.shortcuts import render,redirect
- 세션
- 서버와 클라이언트 사이에서 요청과 응답을 하는데,
그때에 같은 사람이 요청을 하는지 확인을 할 수 있도록 도와주는것- '세션'은 '사용자의 정보'를 저장 할 수 있다로 생각하자.
user앱의 views.py에 접속하여 함수 작성
# 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')
- HttpResponse
- 화면에 출력하기 위한 헤더파일
- HttpResponse("로그인 성공!")
- POST 방식이라면, 로그인 성공 출력
- render(request, 'user/signin.html')
- GET 방식이라면, 화면에 HTML출력
<form class="form-area" method="POST" action="/sign-in/">
{% csrf_token %} #보안 기능 추가
숙제 1. 같은 아이디로 로그인 할 수 없게 제약하기
exist_user = UserModel.objects.filter(username = username)
objects
관리자 객체,
데이터 베이스에대한 인터페이스제공
모델 인스턴스 검색,생성,업데이트 및 삭제 가능
filter
지정된 기준을 충족하는 레코드만 포함하는 새로운 쿼리집합 생성
숙제 2. 로그인에 성공하면, 유저의 아이디를 출력하기
return HttpResponse(f"{me.username}님 반갑습니다.")