본문 바로가기

WEB/Django

2. Url, View, Model, Admin & Template

728x90
반응형

제목을 보고 한 번에 많은 내용을 담으려 하는 것일 수도 있다고 생각할 것이다.

장고는 파이썬이나 알고리즘 과는 다르게 그냥 이런 게 있구나 하고 납득하고 외우고 넘어가는 과정의 연속인 것 같다.

내가 지금까지 공부 해본 바로는 그러했다.

우선 나는 Pycharm에 mysite라는 프로젝트를 생성했다.

점프 투 장고 라는 책을 보면서 따라 하고 있다.

 

<APP>

프로젝트 생성만으로는 아무것도 할 수 없다. 

따라서 게시판의 역할을 해줄 pybo라는 앱을 생성했다.

파이 참의 하단 터미널에 현재 위치가 프로젝트 폴더 일 때 

>>>django-admin startapp pybo

이렇게 적어 주면 pybo라는 이름의 디렉터리와 apps, model, urls, view 등등 이름을 가진 파이썬 파일들이 생성된다.

 

<Urls & View>

이제 기본적인 Hello World!를 출력해보고자 한다.

우선 url은 앱별로 정리 해주는것이 보기 편하다.

여러분이 사진게시판, 음악게시판, 글게 시판 등등 다양한 게시판을 만들려면 여러 개의 앱이 필요할 것이다.

만약 mysite의 하위 폴더에 view.py가 전부 하나로 묶여있다면 유지보수에 굉장히 번거로울 것이다.

따라서 우리가 만든 pybo의 하위 폴더에 urls.py를 만들어 주자.

 

'''
mysite's urls.py
'''
from django.contrib import admin
from django.urls import path,include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', include('pybo.urls')),
]

 

'''
pybo's url.py
'''
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index),
]

 

'''
pybo's views.py
'''

from django.http import HttpResponse


def index(request):
    return HttpResponse("안녕하세요 pybo에 오신것을 환영합니다.")

이렇게 수정해주면 된다.

서버 실행 시에는 다음과 같은 명령어를 사용한다.

>>>python manage.py runserver

후에 웹브라우저로 http://localhost:8000/pybo로 접속하면 해당 문구를 볼 수 있다.

 

위 과정을 정리해 보면 여러분이 런서버를 한 후에 해당 주소로 접속하면 이는 mysite에 있는 urls.py로 전달된다.

이는 pybo에 있는 urls.py를 다시 호출하고 urls.py에서는 pybo에 있는 views.py를 호출한다. 따라서 HttpResponse("안녕하세요 ~ 환영합니다.")를 반환해줘서 인터넷 창에 보여주는 것이다.

 

<Model>

우리는 settings.py에 있는 앱들을 적용하기 위해서 다음과 같은 명령어를 터미널에서 입력한다.

>>>python manage.py migrate

위 명령어를 입력하면 해당 앱들이 필요로 하고 사용하는 테이블을 생성한다.

우리는 장고의 ORM을 사용하기 때문에 해당 테이블들이 어떻게 생성되는지 알고 직접 건드릴 일이 거의 없다.

DB Broswer for SQLite를 사용하면 테이블을 직접 확인 가능하니 참고하도록 하자.

우리는 장고의 ORM을 사용하여 쿼리문을 모르더라도 데이터 작업이 가능하다.

 

'''
pybo's model.py
'''

from django.db import models

# Create your models here.
class Question(models.Model): #models 클래스 상속
    subject = models.CharField(max_length=200) #길이제한 200자
    content = models.TextField()
    create_date = models.DateTimeField() #생성날짜 

    def __str__(self):
        return self.subject

class Answer(models.Model): #models 클래스 상속
    question = models.ForeignKey(Question, on_delete=models.CASCADE) #Question 삭제시 Answer도 삭제
    content = models.TextField()
    create_date = models.DateTimeField()

위와 같이 Question과 Answer 클래스를 구현해 준다.

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pybo.apps.PyboConfig'
]

PyboConfig는 pybo의 apps.py에 있는 클래스이다.

해당 항목을 추가하면 데이터베이스 관련 작업을 할 수 있다.

>>> python manage.py makemigrations
>>> python manage.py migrate

모델이 신규로 생성될 경우 makemigrations 작업을 먼저 해주고 migrate를 해줘야 정상적으로 작동된다.

이제 모델을 만들었기에 모델을 활용해서 직접 게시글을 입력해보려고 한다.

물론 웹페이지에서 블로그에 글 쓰듯이 입력도 가능하지만 여기서는 장고 셸을 이용해서 해보겠다.

 

<Inquiry & Template>

 

'''
pybo's view.py
'''

from django.shortcuts import render, get_object_or_404 #찾는 페이지 없을시 404오류
from .models import Question

# Create your views here.
def index(requset):
    """
    pybo 목록 출력
    """
    question_list = Question.objects.order_by('-create_date')
    context = {'question_list': question_list}
    return render(requset, 'pybo/question_list.html', context)

def detail(request, question_id):
    """
    pybo 내용 출력
    """
    question = get_object_or_404(Question, pk=question_id)
    context = {'question': question}
    return render(request, 'pybo/question_detail.html', context)

위처럼 목록을 보여주는 index 함수와 게시글의 내용을 보여주는 detail 함수를 만들었다.

'''
question_detail.hrml
'''

<!DOCTYPE html>
<html lang="en">
<head>
    <h1>{{ question.subject }}</h1>

<div>
    {{ question.content }}
</div>
</head>
<body>

</body>
</html>
'''
question_list.html
'''
<!DOCTYPE html>
<html lang="en">
<head>
    {% if question_list %}
    <ul>
    {% for question in question_list %}
        <li><a href="/pybo/{{ question.id }}/">{{ question.subject }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>질문이 없습니다.</p>
{% endif %}
</head>
<body>

</body>
</html>

mysite 프로젝트에 templates 폴더를 생성하고 위와 같은 두 가지 html 파일을 구현한다.

pybo의 view.py가 호출되고 파일 안에 함수가 실행될 때 위의 html 파일을 호출해서 사용한다.

728x90
반응형

'WEB > Django' 카테고리의 다른 글

1. What is Django?  (0) 2021.12.27