[Django기초] 개발일지2

손성수·2023년 4월 3일
0

Django

목록 보기
2/17

오늘 배운것

앱 연결하기

  • 터미널
django-admin startapp user
django-admin startapp tweet
  • user앱 - 사용자 관리 ( 회원가입/로그인/로그아웃)을 담당
  • tweet앱 - 글 관리( 글쓰기, 삭제, 수정, 댓글)을 담당
  • settings.py
INSTALLED_APPS = [
    ....(기본 제공 기능들)
    'user',
    'tweet',
]

사용할 앱을 추가한다





데이터베이스와 Django ORM

실행후
db.sqlite3파일이 생성되면 완성



  • 데이터 베이스 연결하기

사진과 같이 data source from path 클릭

db.sqlite3 클릭, ok 클릭

드라이버를 SQLite로 연결


필요한 드라이버 자동 설치

test클릭하여 연결에 문제가 없는지 확인
apply > ok 순서대로 클릭하여 창 나오기





ORM

데이터베이스를 하나의 객채(Object)덩어리로 본다.
데이터베이스를 SQL언어가 아닌 클래스로 쉽게 표현 및 사용

  • user의 models접속하여 아래의 코드 작성
#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)
  • user의 models
    유저의 정보들을 클래스에 담아두었다.
    class meta : db테이블의 이름을 지정해주는 정보
문자열 : CharField, TextField
날짜/시간: DateTimeField, DateField, TimeField
숫자 : IntegerField, FloatField
다른 테이블과 연관을 지어 줄 때 : ForeignKey

어떤 형태로 데이터베이스에 들어갈지 설정





  • 데이터베이스 변경 알려주기, 변경된 데이터베이스 적용하기

장고 서버 종료

터미널 입력

python manage.py makemigrations
  • 데이터베이스 변경을 알려주는 명령어
python manage.py migrate
  • 변경된 데이터베이스를 적용해주는 명령어

다음과 같이 데이터베이스에 등록된걸 확인 할 수 있다.





Admin

학습 목표 : 관리자 페이지 접속, 관리자 페이지에 Model 추가

  • 관리자 페이지를 직접 만들어주는 기능

http://127.0.0.1:8000/admin
관리자 페이지 접속

  • super user 생성
    서버 종료후 터미널창에 명령어 입력
python manage.py createsuperuser
입력후 순서대로
이름과 이메일, 비밀번호 입력
from django.contrib import admin
# django에서 admin툴을 사용하겠다는 의미
from .models import UserModel
# 우리가 생성한 모델을 가져오는 것

# Register your models here.
admin.site.register(UserModel)
# 이 코드가 나의 UserModel을 Admin에 추가 해 줍니다
# 관리자 페이지에 입력한다.

models에 제작한 UserModel을 데이터 베이스에 등록하는 과정

  • admin 페이지 접속

    models에 제작한 UserModel로 class에 등록한 테이블의 필드를 확인할 수 있다.
    시간과 같은것은 자동으로 기입되기에 작성할 필요 없음

Tweet Model 만들기

학습 목표 : 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)
  • ForeignKey : 다른 데이터 베이스에서 내용을 가져온다.

등록하는 과정
1. 서버 종료
2. 데이터베이스 변경 알림
3. 변경된 데이터베이스 적용

manage.py makemigrations
manage.py migrate

  • 새로고침하여, 등록한 tweet 확인

  • tweet앱 안에 있는 admin.py이동




사용자 관리와 로그인 - 화면 띄우기

1 - 템플릿 만들기 (HTML작성)

템플릿에 base.html 파일과
user폴더에 singup,singin.html파일 생성

템플릿을 우클릭후 다음과 같이 디렉토리(폴더)를 생성할 수 있다.

{% extends 'base.html' %}
  • {% %}
    장고의 템플릿 문법
    html파일을 이어서 작성할 수 있도록함.
  • extends 'base.html'
    base.html파일 위에 추가하겠다는 의미

2 - URL - VIEW - TEMPLATE 연결

다시 확인하는 장고의 MVT 패턴

User > URL Conf > View > Model > DB
DB > VIEW > Template > User

  1. 사용자가 url 요청 > 크롬/사파리 등 인터넷 브라우저
  2. mySpartaSns(프로젝트파일)에 요청이 접수 > settings.py의 urls.py
  3. 등록된 url검색 > urls.py에 연결된 앱에 생성한 urls.py
  4. 해당 ul에등록된 view를 찾기
  • 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파일 연결

  • user앱의 urls연결
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을 반환하고 있다.

  1. 사용자가 url/sing-in 접속
    http://127.0.0.1:8000/sign-up/
  1. 프로젝트 파일의 urls.py의 맞는 url연결,(user앱의 urls파일로 이동)

  2. user앱의 urls.py파일이 views.py에 위치한 sing_in_view 함수 호출

  3. user앱의 views.py파일에 위치한 sing_in_view함수는
    템플릿에 위치한 user 디렉토리의 signin.html파일을 반환하고 있다.

  4. template의 user디렉토리의 singin.html파일을 받아온다.

6.사용자에게 html화면을 출력한다.





회원가입 기능 만들기

sing-up 페이지에 post 데이터 전송

GET
데이터를 읽어올때 사용
POST
데이터를 전달하는 과정(저장,수정,삭제)

  • user app의 views.py 이동
def sign_up_view(request):
    if request.method == 'GET':
        return render(request,'user/signup.html')

기능 : 사용자가 url요청을 할때,요청 방식을 참고하여 GET이라면 singup.html화면 전송

    elif request.method == 'POST':
        # 데이터를 저장하는 기능 만들기!

기능 : 요청방식이 POST라면, 데이터 저장

  • url을 요청할 화면, 템플릿의 singup.html 이동
 <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>
  1. 각각의 input값을 받아온다, 아래의 코드는 username에 해당
<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

  1. from데이터 에서, post방식으로 sing-up url로 데이터를 전송하는데
    이때 장고의 내장된 보안 기능이 포함되어 있다.

  2. 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')
  1. POST 방식일때, 데이터를 변수에 저장하고
  2. 비밀번호 두개를 비교했을때 틀리다면 원 페이지로 돌아가고
  3. 조건이 맞다면, 데이터를 저장하고
  4. 로그인 페이지로 이동한다.

redirect를 사용하기위해서는 헤더파일이 필요하다

from django.shortcuts import render,redirect




로그인 기능 만들기

  • 세션
    • 서버와 클라이언트 사이에서 요청과 응답을 하는데,
      그때에 같은 사람이 요청을 하는지 확인을 할 수 있도록 도와주는것
    • '세션'은 '사용자의 정보'를 저장 할 수 있다로 생각하자.
  1. url,view 세팅하기

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출력
  1. url 연결될 템플릿의 signin페이지의 form태그 수정
 <form class="form-area" method="POST" action="/sign-in/">
 {% csrf_token %} #보안 기능 추가
  • form태그 작동시, sign-in페이지에 POST방식요청
  1. user앱의 views.py이동(로그인 작업 마무리)




  1. 현재 같은아이디 다른 비밀번호 설정시 에러창을 띄운다.
  2. 아이디를 잘못 입력시 에러창을 띄운다.




숙제 1. 같은 아이디로 로그인 할 수 없게 제약하기

exist_user = UserModel.objects.filter(username = username)

objects
관리자 객체,
데이터 베이스에대한 인터페이스제공
모델 인스턴스 검색,생성,업데이트 및 삭제 가능

filter
지정된 기준을 충족하는 레코드만 포함하는 새로운 쿼리집합 생성

숙제 2. 로그인에 성공하면, 유저의 아이디를 출력하기

return HttpResponse(f"{me.username}님 반갑습니다.")
profile
더 노력하겠습니다

0개의 댓글

관련 채용 정보