카테고리 없음

장고 2주차 요약 및 문제풀이

abccoco 2022. 5. 27. 19:40

오늘 알아야 할 점들!

1. 장고 orm 기능 알기

2. db와 연동

3. admin 기능, 로그인/회원가입 기능을 살펴보자

 


장고가 일하는 순서

 

 


프로젝트 구조 만들기

 먼저 자신이 만들 프로젝트에서 어떤 기능들이 필요할지 생각한 다음

프로젝트 구조를 만들면 좋을지 생각해본다

기본적으로 user는 많이 들어가니까 user를 만들어 보자

예) sns라면 tweet, user

 

 

user 앱을 만들려면 터미널에 아래의 코드를 추가한다

django-admin startapp user

 

user 앱 생성 완료

 

장고는 앱을 만들었는지 알려주지 않으면 있는지 모른다

장고에게 알려주기 위해서는 settings.py의 설정들 중 INSTALLED_APPS에서 만든 앱 이름 추가한다

# settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'user',
]

 

장고를 db와 연결 후 db와 연결할 orm(class 형태) 모델을 만들어 준다

#user/models.py
from django.db import models

# Create your models here.
class UserModel(models.Model):
    class Meta:
        db_table = "my_user"
    # models안에 문자열(CharField)로 저장하겠다
    username = models.CharField(max_length=20, null=False)
    password = models.CharField(max_length=256, null=False)

 

새로운 orm 모델이 만들어 졌으니 바뀌었다고 터미널에 알려주고, 반영하는 작업이 필요하다

'데이터베이스 변경을 알려주는 명령어' = python manage.py makemigrations

변경된 데이터베이스를 반영 해 주는 명령어' = python manage.py migrate

 

 

여기까지 한 일들

1. 프로젝트 구조 만들기

2. 데이터 베이스 연결

3. user model 만들기

4. 만든 model db에 넣기

 


어드민 페이지 만들기

 

관리자 만들기

터미널에  admin 이메일 패스워드 만들어 관리자 만들기 코드 입력 후 가입

python manage.py createsuperuser

# 이제부터 http://127.0.0.1:8000/admin 페이지 들어가면 관리자 페이지 접속 가능

 

어드민 페이지에 모델 등록

아까 우리가 만들어준 UserModel을 넣어 주려고 해요!

# user/admin.py

# 장고에서 admin툴을 사용하겠다
from django.contrib import admin
# 우리의 위치와 동일하게 있는 modles라는 파이썬 파일을 불러오겠다
# 그 중에 UserModel이라는 모델을 가져오겠다
# models.py에 "class UserModel(models.Model):" 라는 모델이 있는데 이거 가져옴
from .models import UserModel

# Register your models here.
admin.site.register(UserModel) # 이 코드가 나의 UserModel을 Admin에 추가 해 줍니다

등록 전

등록 후

 

 

여기까지가 한일

어드민 페이지 등록

 


html 파일 화면  띄우기 (회원가입/로그인)

먼저 띄울 html 파일을 템플릿 폴더의 유저 폴더 안에 넣어주었다 가정하고 시작!

 

할일: url - view - template 이어주기

url을 연결 할 user앱에 urls.py를 생성 한다

 

생성 후 매인인 mySpartaSns의 url.py와        user앱의 url.py와 연결을 해준다

# mySpartaSns/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # include를 사용해 user안에 있는 urls.py와 연결했다
    path('',include('user.urls')),
]

 

 

user의 urls.py에 연결 할 user앱의 views.py 작성하기

#user/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')

 

이제 user의 url.py에 연결시켜 줄 주소를 적어주면 로그인/회원가입 페이지 접속할 수 있다

# user/urls.py

from django.urls import path
from . import views

urlpatterns = [
    # https://...sign-up/을 실행하면 sign_up_view이 실행된다
    path('sign-up/', views.sign_up_view, name='sign-up'),
    path('sign-in/', views.sign_in_view, name='sign-in'),
]

 

 

여기까지 html 파일 띄우기 완료

 

 


get과 post 요청으로 기능 만들기

 

sign_up_view 함수에 get 방식으로 요청이 왔을때와 post 방식으로 요청이 왔을때

각각 할일을 정해준다

def sign_up_view(request):
    # sign_up_view에 요청이 들어오는 url 실행할 때 .method 를 확인하게 된다
    if request.method == 'GET':
        # return render(화면을 보여준다) user/signup.html 화면을 보여주겠다.
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
    
        return ""

 

signup.html에 form 태그를 사용해  버튼을 누을때 어떤 방식으로 데이터를 보낼지 정해준다

form 태그는 화면의 데이터를 서버로 전송할 때 많이 사용된다#}
{#            회원정보를 저장하고 싶으니까 메소드는 포스트#}
{#            어떤 url로 전달될 건지도 적어주어야 하는데 그렇게 하기 위해서는 action을 사용한다 뒤에 / 없음 오류남 유의!!#}
            <form class="form-area" method="post" action="/sign-up/">
{#                데이터 post할때는 보안을 위해 {% csrf_token %}사용한다.#}
                {% csrf_token %}
                <div class="form-group mt-2 mb-2">
                ..
                ..
{#                    submit 버튼은 from 태그 안에 있으면 해달하는 from을 실행시켜 주는 역할을 한다#}
{#                    버튼을 누르고 있으면 이곳을 감싸고 있는 from 태그가 실행된다#}
{#                    action에 데이터를 보내주는 역할을 한다#}
                    <button type="submit" class="btn btn-primary">회원가입</button>
                    <a href="/sign-in" class="btn btn-secondary">로그인 페이지로</a>
                </div>
            </form>

 

html에서 보내준 데이터를 저장한다 html에서는 post 방식으로 데이터를 보냈으니

views.py에 if문에서 post일 경우 코드를 추가 작성해준다

#user/views.py

# .은 내가 가지고 있는 위치 나의 위치와 동일한 친구중에 models을 갖고 올 건데 라는 의미
# 그 우리의 models.py 중에서 UserModel 이라는 친구를 가져온다
from .models import UserModel
# 화면에 글자 띄우는 역할
from django.http import HttpResponse

def sign_up_view(request):
    # sign_up_view에 요청이 들어오는 url 실행할 때 .method 를 확인하게 된다
    if request.method == 'GET':
        # return render(화면을 보여준다) user/signup.html 화면을 보여주겠다.
        return render(request, 'user/signup.html')
    elif request.method == 'POST':
        # post로 온 데이터를 이렇게 받는다 그리고 받은것 중에서 input 태그 안에 username이라는
        # 이름으로 되었는 데이터를 가져오고 싶다 만약 username이 없다면 none 빈칸 처리하겠다는 의미
        # 마지막으로 그 데이터를 username이라는 변수에 저장한다
        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 = UserModel()
            # 넣은 UserModel() 안에 username 안에 username을 넣어준다
            new_user.username = username
            new_user.password = password
            new_user.bio = bio
            # 위에까지는 db에 저장이 안되고
            # new_user.save()를 작성하므로 db에 저장된다
            new_user.save()

        # 저장 다 되면 회원가입 페이지 말고 로그인 페이지 보여주고 싶어! 이때 redirect 사용(import도 해야함)
        return redirect('/sign-in')

 

 

여기까지 한 일들

post 방식으로 데이터를 받아왔을때 받아온 데이터중 내가 저장하고 싶은 데이터만 고르기와

그 데이터를 db에 저장하기

get 방식으로 데이터를 가져왔을때는 render를 사용해 같은 페이지를 띄워주기까지 했다

 

 


숙제

지금 회원가입은 데이터베이스에 동일한 사용자가 있어도 가입이 됩니다. 사용자는 유일하게 만들어져야 하기 때문에 회원가입 시에 이미 있는 사용자 인지 확인하는 코드를 작성 해 주세요

 

내가 작성한 답안

# 디비의 유저 모델에서 유저 내임 가져와서 같으면 페이지 새로 고침하게 만들었다

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)

		# 디비의 유저 모델에서 유저 내임 가져와서 같으면
        registered_user = UserModel.objects.get(username=username)
        # 페이지 새로고침하도록 만들었다
        if registered_user.username == username:
            return render(request, 'user/signup.html')
        elif 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/models.py
from django.db import models
class UserModel(models.Model):
디비 정보는 매타에 저장한다
    class Meta:
내 테이블 이름은 마이 유저
        db_table = "my_user"