질문 리스트 페이지
질문 상세 페이지

 

 이전까지의 과정으로 위와 같이 질문 목록을 보여주는 페이지와 질문글 상세 페이지를 만들 수 있었다. 

이번엔 웹 페이지를 디자인적으로 좀 더 그럴싸한 형태로 다듬을 차례이다. 

 

1. 스태틱(static) 디렉토리 

 웹 페이지의 디자인을 손보기 위해 스타일시트 파일을 만들어 적용할 것이다.  그리고 스타일시트 파일을

저장하기 위해 스태틱 디렉토리가 필요하다.  먼저 config/settings.py 를 다음과 같이 수정한다.

STATICFILES_DIRS 라는 변수를 추가하여 static 디렉토리의 경로를 추가해주었다. 

 

 

다음으로 static 디렉토리를 settings.py 에 추가된 경로에 실제로 생성해준다.

템플릿 디렉토리와 마찬가지로, 스태틱 디렉토리 또한 앱 디렉토리 하위에 바로 static 디렉토리를 생성하면

settings.py 파일의 수정 없이도 자동으로 인식하지만 템플릿 디렉토리도 그랬듯이 앱끼리 공통적으로 사용하게될

스태틱 파일 등의 문제로 추천되지 않는다. 이 글에서는 프로젝트 하위에 static 디렉토리를 생성하고 그 안에서

앱마다 하위 디렉토리를 생성하는 방식을 취한다.

 

 

우선 static 디렉토리에 간단한 스타일시트를 생성해보자. 다음과 같이 style.css 파일을 생성한다.

textarea 의 너비를 100%로 하고 답변등록 버튼의 상단에 10픽셀의 마진을 주는 스타일 시트이다. 

 

 

2. 스타일시트(Style Sheet) 적용

이제 이 스타일 시트를 질문 상세 템플릿에 적용해야한다. question_detail.html 을 다음과 같이 수정한다.

static 파일을 사용하기 위해 {% load static %} 코드를 상단에 삽입하여 스태틱 파일들을 로드한 뒤, link 태그를 

사용하여 스타일시트를 적용한다.

 

다시 웹 페이지에 접속해보면 위와 같이 텍스트 영역의 너비가 창 크기 전체를 차지하고 답변등록 버튼과

텍스트 영역 사이에 마진이 생긴 것을 확인할 수 있다. 

'개인 프로젝트 > Django-mysite' 카테고리의 다른 글

#12 템플릿 상속  (0) 2021.09.23
#11 부트스트랩(Bootstrap)  (0) 2021.09.22
#9 데이터 저장 1  (0) 2021.09.21
#8 URL과 네임스페이스  (0) 2021.09.21
#7 템플릿(Template)  (0) 2021.08.16

1. 답변등록 폼

 질문글 리스트와 질문글 상세 페이지까지 구현이 끝났으니 드디어 질문 글에 답변을 등록하는 기능을 만들 차례이다.  

먼저 답변을 등록하기 위한 폼(form)을 추가해야한다.  답변은 질문 상세 페이지에서 댓글처럼 등록할 수 있도록 할

것이기 때문에 질문 상세 페이지(question_detail.html)에 다음과 같이 폼을 추가한다.

 

form 태그action 속성은 form 태그 내에서 입력받은 데이터를 전송할 url과 전송 방식(get or post)을

지정한다. 여기서는 pybo 앱의 answer_create 라는 별칭의 url을 데이터를 전송할 url로, 전송 방식은 post

지정하였다.

 

{% csrf_token %} 은 보안을 위한 코드이다. 제출된 form 이 실제 웹페이지에서 작성한 데이터가 맞는지를

가늠하기 위해 서버에서 발행한 토큰값과 비교하고 만약 비정상적인 방법으로 제출된 데이터라면 토큰이

일치하지 않아 오류가 발생할 것이다. form 태그에서 입력받는 모든 정보에 대해 보안을 보장하기 위해 form 태그

바로 아래에 이 코드를 위치시켜야 한다. 

 

text_area 태그는 답변의 내용을 작성할 텍스트 영역이다.  여기서는 이름을 content(내용)로 지정하고 최대

15줄까지 보여지도록 설정한다. 지정한 줄 수를 넘어가면 텍스트 영역은 자동으로 스크롤 바를 생성한다.

(15줄 이상 입력하지 못하는 것이 아니다.)

 

input 태그는 type 속성에 따라 여러 형태로 사용자의 입력을 받아들이기 위한 태그이다. 여기서는 답변의

내용을 제출하기 위한 submit 속성으로 지정하였다.  submit 속성의 버튼이 클릭되면 지금까지 form 에 입력된

모든 데이터는 action 속성에 지정된 url로 지정된 전송 방식에 따라 전송된다. 

 

 

2. URL 매핑, 뷰 함수 추가

 물론 위의 작업만을 수행하고 웹페이지에 접속하면 에러가 발생한다. action 태그에 pybo:answer_create 라는

url 별칭을 사용했지만 그런 url 매핑은 등록해두지 않았기 때문이다. 

 

pybo/urls.py 에서 다음과 같이 url 매핑을 추가한다.

pybo:answer_create 을 추가해두었으니 이제 url 매핑 문제는 해결했다.  그러나 이번에는 뷰 함수에

answer_create 라는 함수가 존재하지 않는다.  이 또한 추가해줄 필요가 있다.

 

pybo/views.py 에 다음과 같이 timezone 모듈을 import 하고 answer_create 함수를 추가해준다.

먼저 question = get_object_or_404(Question, pk=question_id) 로 답변을 등록할 질문 객체를 가져온다.

그 다음 question 의 answer_set에서 form에서 POST 방식으로 전송받은 데이터중 content에 해당하는 것을

내용으로, timezone 모듈로 얻은 현재시각을 생성 시간으로 하여 새로운 답변을 생성한다.  물론, Answer 모델을

직접 사용하여 답변을 등록할 수도 있다.  과정만 다를 뿐 결과는 동일하다. 답변 등록이 완료되면 redirect를

호출하여 답변을 등록한 질문의 상세페이지로 돌아간다.

 

여기까지 완료되었다면 다음과 같이 질문 상세페이지에서 답변 등록 폼이 보이며 답변의 등록 또한 가능하다.

하지만 아직까지는 답변을 등록해도 변하는 것이 없다.  등록된 답변을 보여주는 기능을 질문 상세 페이지에

추가하지 않았기 때문이다.

 

 

 

3. 답변 조회

 이제 질문 상세 페이지에 현재 질문에 달린 답변을 모두 보여주는 기능을 추가한다.

 

templates/pybo/question_detail.html 를 다음과 같이 수정한다.

question.answer_set 에 담긴 답변의 갯수와 각 답변의 내용을 보여주는 코드를 추가한 것을 알 수 있다.

 

여기까지 완료되었다면 다음과 같이 등록한 답변이 질문 상세페이지에 출력된다.

 

'개인 프로젝트 > Django-mysite' 카테고리의 다른 글

#11 부트스트랩(Bootstrap)  (0) 2021.09.22
#10 스타일시트(Style Sheet)  (0) 2021.09.22
#8 URL과 네임스페이스  (0) 2021.09.21
#7 템플릿(Template)  (0) 2021.08.16
#6 django admin  (0) 2021.08.16

1. URL 하드코딩

 question_list.html 파일을 살펴보면 템플릿 코드에서 url을 직접 만들어서 넣어주었다.  이러한 방식은 url에 수정사항이 발생할 때 마다 모든 url 코드를 찾아 수정해야하는 불편이 발생한다.  이를 해결하기 위해 url의 별칭을 사용한다.

 

먼저 pybo/urls.py 를 다음과 같이 수정한다.

각 url 매핑에 name 속성을 부여한 것을 볼 수 있다. 이제 이 url 매핑은 하드코딩할 필요 없이 별칭만으로 사용할 수 있다.  이제 템플릿에서 하드코딩한 url을 별칭으로 대체할 차례이다.

 

templates/pybo/question_list.html 을 다음과 같이 수정한다.

"/pybo/{{ question.id }}" 로 하드코딩 되어있던 url 링크가 "{% url 'detail' question.id %}" 로 변경된 것을 볼 수 있다.

이제 detail 에 해당하는 url이 수정되더라도 템플릿은 수정할 필요가 없어졌다.

 

 

2. URL 네임 스페이스

 그런데 만약 pybo 이외의 앱을 추가했을 때, 그 앱에서도 같은 별칭의 url을 사용한다면 위의 방식으로는 중복이

발생하는 문제가 생긴다.  이를 해결하기 위해서 각 앱의 url 매핑마다 네임 스페이스를 지정해야한다. 

 

pybo/urls.py 를 다음과 같이 수정한다.

app_name = 'pybo' 를 추가하여 현재 앱의 url 매핑을에 'pybo' 라는 이름을 붙였다.  이제 템플릿 파일에서 별칭을 사용한 코드도 수정해줘야 한다.

 

url 링크가 "{% url 'detail' question.id %}" 에서 "{% url 'pybo:detail' question.id %}" 로 변경된 것을 확인할 수 있다.

url 네임스페이스 : url 별칭 의 형태로 사용하는 것으로 다른 앱끼리의 별칭의 중복을 피하는 것이다.

'개인 프로젝트 > Django-mysite' 카테고리의 다른 글

#10 스타일시트(Style Sheet)  (0) 2021.09.22
#9 데이터 저장 1  (0) 2021.09.21
#7 템플릿(Template)  (0) 2021.08.16
#6 django admin  (0) 2021.08.16
#5 django 의 기본 요소 - Model 사용  (0) 2021.08.11

1. pybo 페이지

 접속 가능한 로컬 서버와 데이터를 나타낼 모델까지 준비가 끝났으니 이제 실제로 서버에 접속한 사용자에게 데이터를 보여줄 차례이다. 

pybo\views.py 의 내용을 위와 같이 수정한다. Question 데이터를 생성 날짜순으로 내림차순 정렬한 뒤 pybo\question_list.html 이라는 템플릿으로 넘겨주고 그 결과를 렌더링하여 웹상에서 보여주겠다는 내용이다.

 

DIRS 에 templates 디렉토리를 추가.

이제 데이터를 넘겨줄 템플릿을 실제로 만들어야한다.  우선 템플릿들을 저장할 templates 디렉토리를 mysite 디렉토리 하위에 생성한다.  pybo 디렉토리 내에 templates 디렉토리를 생성해도 되고 그렇게하면 별도의 설정없이도 django에서 템플릿 디렉토리로 인식하지만 여러 앱이 공유하는 템플릿의 위치 문제등을 고려하면 화면을 구성하는 템플릿들은 하나의 디렉토리에 모아두는게 좋다고 한다.  그러니 여기서는 mystie 하위에 templates 디렉토리를 생성하고 그 내부에 각 앱들의 템플릿을 모아둘 디렉토리를 생성한 뒤 config\settings.py에서 템플릿 디렉토리로 등록해준다.

 

templates\pybo\question_list.html 을 위와같이 수정한다. html코드 사이에 들어간 중괄호로 둘러쌓인 코드를 템플릿 코드라 한다.  이처럼 HTML태그와 템플릿 코드를 혼용하여 작성한 파일을 템플릿이라 한다.  python의 문법을 아는 사람이라면 템플릿코드의 의미는 어렵지않게 이해할 수 있다.  위의 템플릿의 경우 question_list가 비어있지 않다면 question_list 내의 question들을 하나씩 순회하며 각 question의 id번호에 매칭되는 url을 하이퍼링크로 가지는 텍스트를 리스트형태로 보여주는 것이다. 텍스트의 내용은 각 question의 제목이 된다.  만약 question_list가 비어있다면 "질문이 없습니다." 라는 메시지가 출력된다.

 

이제 localhost:8000/pybo/ 에 접속하면 위와 같이 저장한 question 들이 리스트의 형태로 표시된다.

 

 

2. Question Detail 

 pybo 페이지에서 각 question들에 걸린 하이퍼링크를 따라가면 당연하게도 에러가 발생한다.  하이퍼링크의 url은 ~/pybo/{id번호} 의 형태로 되어있는데, 우리는 아직 그런 페이지의 url 매핑을 해주지 않았기 때문이다.

 

pybo\urls.py 를 위와 같이 수정한다.  pybo/{question_id} 형태의 url에 대해 pybo\views.py의 detail 메소드를 매핑한 것이다.  

 

다음으로 pybo\views.py에 detail 메소드를 추가해준다.  question_id는 url 매핑시에 저장된 question_id가 전달된다.

get_object_or_404는 Question.get() 을 호출한 것과 같은 기능이지만 찾으려는 모델이 존재하지 않을 경우 get을 사용하면 500에러가 발생하는데 비해 get_object_or_404는 404에러(page not found)를 일으킨다.  없는 데이터를 요청했을 때의 에러는 404페이지가 출력되는 것이 바람직하기에 get_object_or_404쪽을 쓰기로한다.  pk는 primary key, 즉 모델의 기본키를 의미한다. 

 

마지막으로 detail 에서 렌더링할 pybo\question_detail.html 템플릿을 위와같이 작성한다. 매우 간단하게 질문의 제목과 내용만을 표시하는 템플릿이다.

 

이제 pybo 페이지에서 질문글을 클릭하면 질문의 제목과 내용을 볼 수 있다.

 

'개인 프로젝트 > Django-mysite' 카테고리의 다른 글

#9 데이터 저장 1  (0) 2021.09.21
#8 URL과 네임스페이스  (0) 2021.09.21
#6 django admin  (0) 2021.08.16
#5 django 의 기본 요소 - Model 사용  (0) 2021.08.11
#4 django 의 기본 요소 - Model 작성과 Migration  (0) 2021.08.11

 django에는 django admin이라는 굉장히 편리한 기능이 있다.  지금까지 우리가 쉘에서 해온 작업들을 django admin을 사용하면 훨씬 편하게 수행할 수 있다.

 

 

1. 슈퍼유저

 django admin을 사용하기 위해 슈퍼유저를 생성할 필요가 있다.  createsuperuser 명령어로 슈퍼유저를 생성한다.

python manage.py createsuperuser

 

필자의 경우 이미 만들어둔 슈퍼유저가 있기에 같은이름을 사용하려고 하니 이미 존재하는 이름이라며 에러가 발생한다.  다른 이름을 입력한 뒤 이메일, 패스워드를 설정해준다. 패스워드가 충분히 강력한지 검사하여 너무 취약한 패스워드를 사용할 경우 위와 같이 경고메시지가 뜨지만 무시하고 진행할 수도 있다.

 

삭제의 경우 django shell 에서 django.contrib.auth.models 의 User 모델에서 유저명과 슈퍼유저 여부를 조건으로 삭제할 슈퍼유저 데이터를 가져온 뒤 delete()를 실행해주면 된다. 이전에 Question, Answer 데이터를 삭제할 때와 같은 방식이다.

 

 

2. django admin 접속

 이제 로컬 서버를 구동한 뒤 http://localhost:8000/admin/ 에 접속한다.

python manage.py runserver

 

접속하면 위와 같이 로그인 화면을 볼 수 있다.  방금 생성한 슈퍼유저 계정으로 로그인을 해보자

 

로그인을 하면 위와 같이 사용자와 그룹의 데이터를 추가, 변경, 조회 가능한 것을 볼 수있다.  

 

 

3. django admin 을 사용한 모델 관리

 여기서부터가 django admin의 진면목이다.  pybo\admin.py 를 수정하여 django admin에 더 많을 기능을 추가할 수 있다.

 

pybo\admin.py 를 위와 같이 수정해준다.  pybo\models.py에 정의해둔 Question과 Answer 클래스를 import 한 뒤 admin.stie에 등록한다는 의미이다. 수정한 뒤 다시한번 admin 페이지에 접속해보자

 

 

방금 전까지는 그룹, 사용자 모델만을 관리할 수 있던 admin 페이지에서 이제는 PYBO의 모델들도 관리할 수 있게되었다. 

 

추가를 클릭하면 GUI 환경에서 편리하게 데이터를 생성할 수도 있다.

 

 

이번에는 데이터를 검색하기 위해 admin.py를 한번 더 수정해본다.

pybo\admin.py 를 위와 같이 수정한 뒤 다시한번 관리자 페이지에 접속한다.

 

 

Question의 데이터 리스트 위에 검색창이 추가된 것을 볼 수 있다.  'subject' 항목으로 검색할 수 있도록 하였기 때문에 질문의 제목으로 검색이 가능하다.

 

시험삼아 Model로 검색해보니 Model이 포함된 질문 하나만이 필터링 되는 것을 볼 수 있다.

 

django admin은 이 밖에도 편리한 기능들을 무수히 많이 제공하니 잘 알아둘 필요가 있다.  django admin에 대한 자세한 내용은 공식문서(https://docs.djangoproject.com/en/3.0/ref/contrib/admin/)를 참고하도록 하자.

 드디어 모델을 사용하기 위한 준비가 끝났다. 이제 django 쉘을 실행하여 직접 모델의 인스턴스를 생성하고 데이터베이스에 저장, 조회하는 작업을 해보자.

 

1. django shell

 아래 명령어를 실행하여 django 쉘을 실행할 수 있다.  장고 쉘은 python 인터프리터와 유사한 환경이며 실제로 파이썬 문법도 사용가능하다. 

python manage.py shell

 

 

2. Question 생성

pybo\models.py 에 정의된 Question 과 Answer 모델(클래스), timezone 모듈을 import 한 뒤  Question 모델의 인스턴스를 하나 만들어본다. timezone 은 생성시간을 넣어주기 위해 사용하였다.  q.save()를 실행하면 데이터베이스의 Question 모델 인스턴스 리스트에 추가된다. 이 때, q.id 를 출력해보면 어떤 숫자가 나오는데, 이 id는 인스턴스가 생성될 때 마다 자동으로 생성/부여되는 고유키이다.  필자의 경우 기존에 3개의 Question 인스턴스가 저장된 상태이기에 새로 생성한 질문의 id는 4가 되었다. 

 

 

3. Question 조회

이제 생성한 Question 모델을 조회해 볼 차례이다.  Question.objects.all() 을 실행하면 위와 같이 저장된 Question 모델의 인스턴스들을 쿼리셋 객체의 형태로 반환한다. 각 오브젝트 옆에 (숫자)가 붙어있는데, 이는 각 인스턴스의 id번호를 의미한다. 여기에 표시되는 부분은 모델을 정의한 pybo\models.py 를 수정하여 바꿀 수도 있다.

 

모델을 정의한 클래스에 __str__ 메소드를 구현해줄 경우, 그 클래스의 인스턴스를 문자열화 할 때의 결과를 컨트롤 할수 있다. 위와같이 자신의 제목을 반환하도록 메소드를 구현해보자.

 

그 후에 다시 Question의 오브젝트들을 조회해보면 id대신 그 질문의 제목이 표시되는 것을 확인할 수 있다. 모델에 새로운 메소드를 추가할 경우에는 makemigrations와 migrate를 수행할 필요 없이 django shell만을 재실행하면 적용이 된다. migrate가 필요한 경우는 모델의 속성이 변경된 경우 뿐이다.

 

 

이제 Question 중 원하는 것만을 조회하는 방법을 알아보자.

조건에 맞는 오브젝트를 조회하기 위한 방법으로 filter를 사용하는 방법과 get을 사용하는 방법 두 가지가 있다.  위에서 보다시피 filter를 사용한 경우엔 쿼리셋이, get을 사용한 경우엔 단순히 Question 오브젝트 하나가 반환되었다.  이는 filter는 조건에 맞는 모든 오브젝트들을 반환하고, get은 조건에 맞는 단 하나의 오브젝트만을 반환하기 때문이다.  그렇기 때문에 get으로 조회하려면 조건이 될 속성은 오브젝트마다 유일한 값이어야한다. 

 

필터의 경우 사용법만 알면 굉장히 다양한 조건으로 데이터를 추려낼 수 있다. 필터의 자세한 사용법은 장고 공식문서(https://docs.djangoproject.com/en/3.0/topics/db/queries/)를 참고하는 것이 좋다.

 

 

4. Question 수정/삭제

다음은 이미 저장된 데이터의 수정이다.  위와 같이 수정하려는 데이터를 가져온 뒤 수정하려는 속성 값을 변경, save()를 다시한번 실행해주면 수정된 데이터가 반영된다.  save()까지 실행해주지 않으면 변경사항은 적용되지 않는다.

 

삭제는 더욱 간단하다. 수정과 마찬가지로 Question에서 삭제할 데이터를 가져온 뒤 delete()를 실행해주면 데이터는 삭제된다.

 

 

5. Answer의 작성/조회

Answer 모델의 데이터를 작성하는 것도 Question과 같은 방식으로 진행한다.  다만 Answer의 경우 생성을 위해 Question이 필요하기 때문에 먼저 매칭될 Question 데이터를 하나 가져온 뒤 작성한다.

 

조회 또한 같은 방식으로 하면 된다.  Answer 데이터에는 question 속성이 연결되어있기 때문에 어느 질문에 대한 답인지도 확인 가능하다.  그렇다면 Question 데이터를 가지고있을 때 그에 대한 Answer 데이터들을 조회하는 것도 가능할까?

 

Answer에 Foreign Key 로 Question 모델이 연결되어있기 때문에 Question 데이터에서 answer_set을 사용하여 연결된 Answer 데이터들에 접근할 수 있다.  이는 django에서 기본적으로 지원하는 기능이기에 사용자가 별도로 신경써야할 부분은 없다.  Foreign Key로 연결된 데이터에서 연결모델명_set 은 자주 사용되는 기능이니 반드시 기억해둘 필요가 있다.

'개인 프로젝트 > Django-mysite' 카테고리의 다른 글

#7 템플릿(Template)  (0) 2021.08.16
#6 django admin  (0) 2021.08.16
#4 django 의 기본 요소 - Model 작성과 Migration  (0) 2021.08.11
#3 django 의 기본 요소 - URL, View  (0) 2021.08.11
#2 개발 환경 갖추기(2)  (0) 2021.08.10

 django 에서는 데이터베이스를 활용하기 위해 ORM(Object Relational Mapping)과 모델(Model)을 사용한다.  ORM 방식을 사용하면 데이터의 모델과 데이터베이스의 데이터를 매핑, 자동으로 SQL문을 생성하는 것으로 사용자가 직접 쿼리문을 작성하지 않아도 데이터의 저장과 조회가 가능하다.  SQL문이 아니라 사용하는 언어의 메소드와 클래스 등을 통해 데이터베이스를 조작할 수 있기 때문에 사용도 편하고 코드의 가독성도 높아진다. 이러한 특성상 DBMS의 교체가 이루어지더라도 프로그램적인 리스크가 매우 적으며 쿼리문을 잘못 작성하여 성능상의 심각한 불이익이 생기는 경우도 줄어든다.  이번에는 django에서 모델과 ORM을 사용하여 데이터베이스를 활용하는 방법을 알아본다.

 

 

1. Migration

 config\settings.py 를 열어보면 위와같은 내용이 있다. 그중 붉은 테두리 안의 내용은 django 프로젝트를 생성하면 자동으로 설치되는 앱(app)들의 목록이다.  이 중 admin, auth, contenttypes, sessions 앱들은 데이터베이스가 필요한 앱이기 때문에 migration을 필요로 한다.  django 에서 migration 이란 모델의 변경 내역을 DB에 적용시키는 것을 의미한다.

모델이 추가/변경 된 후 migration을 실행할 때 마다 migrations 디렉토리에 migration 파일이 생성되고, 이는 그 migration이 발생한 시점의 모델의 구조에 대한 정보를 담고있다.  즉, 모델 구조의 버전관리 시스템이라고 볼 수 있다.

 

config\settings.py 를 좀더 살펴보면 위와같이 데이터베이스에 대한 내용도 있다.  디폴트 엔진은 파이썬에 내장된 SQLite용 모듈인 sqlite3으로 되어있는 것을 확인할 수 있다.  SQLite는 개발용 혹은 소규모 프로젝트용으로 사용되는 가벼운 파일기반 DB이다. 개발중에는 SQLite를 사용하여 빠르게 개발하고 실제 운영할때는 규모있는 DB로 전환하는 것이 일반적인 개발 패턴이라고 한다.  이 부분을 수정하면 사용할 데이터베이스를 변경하거나 패스워드를 설정하는 등이 가능하지만 개발단계이기에 아직은 디폴트로 사용하기로한다. 

 

이제 migrate를 실행하여 현재 데이터베이스를 사용하는 앱들을 위한 테이블을 만든다.

python manage.py migrate

 

 정상적으로 실행됐다면 Applying ~ 으로 시작하는 결과가 여러줄 출력될 것이다.  필자의 경우 이미 실행한 상태이기 때문에 migration이 발생하지 않았다.

 

 

2. 모델 작성

 이제 직접 모델을 만들어볼 시간이다.  먼저 pybo\models.py 에 모델 클래스를 정의한다.

Question 모델은 제목을 나타낼 최대길이 200자의 문자열필드와 내용을 나타낼 텍스트필드, 작성 일시를 나타낼 날짜/시간 필드를 가지며, Answer 모델은 외래키로 Question 모델을 가지며 Question이 삭제될 경우 함께 삭제되고 내용을 나타낼 텍스트 필드와 작성 일시를 나타낼 날짜/시간 필드를 가진다.  모델의 정의에 사용 가능한 다른 필드들에 대한 정보는 django 공식문서(https://docs.djangoproject.com/en/3.0/ref/models/fields/#field-types)에서 확인 가능하다.

 

다음은 데이터베이스 작업을 하기 위해 config\settings.py 파일에서 INSTALLED_APPS 리스트에 pybo.apps.PyboConfig 를 추가해준다.  이렇게 앱을 등록해줘야 데이터베이스 관련 작업을 할 수 있다.

 

 

모델을 작성하고 앱도 등록했으니 이제 pybo를 위한 테이블을 만들 차례이다.  모델이 새로 작성되거나 변경된 경우에는 migrate을 실행하기 전에 makemigrations 명령을 수행할 필요가 있다.

python manage.py makemigrations
python manage.py migrate

 

makemigrations의 경우 모델에 변경사항이 있을 때 실행하면 변경사항의 로그가 출력된다. migrate의 경우 위에서 설명했듯이 Applying~ 으로 시작되는 migration이 적용됐음을 알리는 로그가 출력된다.  필자의 경우 이미 끝나있는 상태이기에 변경사항이 없다는 메시지가 출력되었다.

'개인 프로젝트 > Django-mysite' 카테고리의 다른 글

#6 django admin  (0) 2021.08.16
#5 django 의 기본 요소 - Model 사용  (0) 2021.08.11
#3 django 의 기본 요소 - URL, View  (0) 2021.08.11
#2 개발 환경 갖추기(2)  (0) 2021.08.10
#1 개발 환경 갖추기(1)  (0) 2021.08.09

 django 개발환경 구축이 끝났으니 이제 본격적으로 게시판(Jump to Django 에서는 pybo라고 명명)을 만들어나가며 django의 기능들을 익혀나가기로 한다.  이번에는 url과 view에 대해 알아본다.

 

1. 앱(app)의 생성

 이전 파트에서는 django의 프로젝트를 생성하여 서버를 구동하고 사이트에 접속하여 초기화면이 나오는 것을 확인하였다.  이제 우리가 원하는 화면을 띄우기 위한 작업을 할 차례이다.  이를 위해서는 app을 생성할 필요가 있다.  

django-admin startapp pybo

 

django-admin(django관리자) 명령어를 사용하여 앱을 생성한 뒤 생성된 앱(디렉토리)으로 이동하여 내용물을 확인해보면 위와같은 파일들이 생성된 것을 확인할 수 있다. (forms.py 따로 추가한 파일이기에 처음에는 존재하지 않는다.)

 

 

2. config\urls.py,  pybo\views.py 파일의 수정

 이제 서버를 구동한 뒤 http://localhost:8000/pybo 로 접속하면 우리가 원하는 화면이 나오도록 해야한다. 

config\urls.py 파일을 열어 다음과 같이 수정한다.

이와같이 수정하면 localhost:8000/pybo/ 가 요청되었을 때 pybo\views.py 에 정의된 index 메소드를 실행하게된다.

 

다음은 pybo\views.py에 가서 실행될 index 메소드를 정의한다.  여기서는 단순히 문자열 하나를 출력하는 수준의 기능만을 구현한다.

 

이제 사이트에 접속해보면 Hello Pybo가 출력되는 것을 확인할 수 있다.

 

3. url의 분리

 프로젝트 전체의 url 매핑 파일인 config\urls.py에서 위와 같이 매핑을 추가하면 pybo 앱의 기능이 추가될 때마다 config\urls.py를 수정해야 하는데, 이는 별로 좋은 방식이 아니다.  pybo 앱의 내부에도 urls.py 파일이 있는데, 여기에 pybo/ 이후의 매핑을 추가한 뒤 config\urls.py 에서는 pybo/ 로 시작하는 url의 매핑에 pybo의 urls.py를 사용하도록 하는 것이 바람직하다. 

 

위와 같이 django.urls.include 를 import 한 뒤 pybo/ 의 매핑에 pybo\views.py의 인덱스 메소드 대신 include('pybo.urls') 를 넘겨준다.  이제 pybo/ 로 시작하는 url의 매핑은 pybo\urls.py에 정의된 내용을 토대로 이루어지기 때문에 pybo에 기능을 추가하더라도 config\urls.py 를 수정할 일은 없어졌다.

 

다음은 pybo\urls.py 를 위와 같이 수정해준다.  실행했을때의 결과는 전과 달라진게 없지만 pybo의 기능추가를 위해 config\urls.py 파일을 수정할 필요가 없어졌기에 구조적으로는 더욱 깔끔해졌다.

4. Django 설치 및 프로젝트 생성

드디어 Django를 설치하고 프로젝트를 생성할 시간이다.  위와 같이 프로젝트들을 저장할 projects 디렉토리를 생성하고 디렉토리에 진입한 후 이전에 미리 생성해둔 가상환경에 진입해준다.

C:\venvs\mysite\Scripts\activate

 

 가상환경에 진입한 상태에서 이번에 진행하게될 프로젝트인 mysite의 디렉토리를 생성한 후 디렉토리에 진입한다.

이후 pip 모듈을 사용하여 django를 설치한다.

pip install django

위와같이 pip 버전이 최신이 아니라는 경고문구가 뜰 경우 업그레이드를 해준다.

python -m pip install --upgrade pip

 

이제 django-admin(장고 관리자)를 실행하여 프로젝트를 생성한다. 

django-admin startproject config .

mysite 디렉토리 내부를 확인해보면 config 디렉토리와 manage.py 가 생성된 것을 확인할 수 있다.  생성된 디렉토리는 프로젝트의 설정파일 등이 생성되어 담겨있으며 manage.py 는 django로 개발한 서버를 구동하기 위한 파일이다.  명령문의 마지막에 붙은 . 은 현재 디렉토리에서 프로젝트를 시작한다는 의미이다.

 

 

 여기까지 오면 서버를 구동시킬 수 있다.  물론 아직 배포단계가 아닌 개발단계이기에 로컬호스트(127.0.0.1)로만 접속 가능한 상태이다.  브라우저의 url창에 localhost:8000 또는 127.0.0.1:8000 을 입력하여 서버에 접속하면 위와 같은 화면을 볼 수 있다. 서버를 종료하고 싶으면 명령 프롬프트에서 Ctrl+C 를 입력하여 종료시킬 수 있다.

 

 

5. 가상환경에 쉽게 진입하기 위한 설정

 가상환경에 진입하기 위해 매번 C:\venvs\mysite\Scripts\activate 를 실행해주는 것은 매우 번거로운 일이다. 이를 해결하기 위해 간단한 설정을 해두기로 한다.

먼저 가상환경들을 모아둔 venvs 디렉토리로 이동한 뒤 mysite.cmd 파일을 생성한다.  미리 설치해둔 vim을 사용하여 쉽게 생성할 수 있다.

vi mysite.cmd

 

cmd 파일은 작성한 명령어를 순차적으로 실행해주는 배치파일이다.  실행시 .cmd를 생략하고 파일명으로만 실행 가능하기 때문에 간단한 쉘 명령어를 만든다는 느낌으로 작성 가능하다. 위 와같이 작성할 경우 C:\projects\mysite 디렉토리로 이동하여 가상환경에 진입하라는 의미가 된다.  @echo off 는 실행한 명령어를 프롬프트에 출력하지 않겠다는 의미이다.

 

이제 이 배치파일을 어느 경로에서든 이름만으로 실행 가능하도록 하기 위해 환경변수의 PATH에 추가한다. 

window+r 을 눌러 실행 창을 연 다음 "고급" 탭에서 환경변수로 들어간다.  

 

그 다음 사용자 변수에서 Path를 선택한 뒤 편집을 클릭한다.

 

새로 만들기 버튼을 누르고 mysite.cmd가 존재하는 디렉토리인 C:\venvs를 추가해준 뒤 확인을 클릭, 환경 변수 창에서 한번 더 확인을 클릭하면 환경변수의 등록이 완료되었다.  이제 어느 디렉토리에서나 mysite를 실행하는것으로 바로 가상환경에 진입 가능하게 되었다.

 

 

6. PyCharm의 설치 및 django 개발환경 세팅

 이제 django로 보다 편하게 개발하기 위해 Python IDE인 PyCharm을 설치하고 개발환경을 세팅한다.

PyCharm의 설치는 공식 다운로드 페이지(https://www.jetbrains.com/ko-kr/pycharm/download/#section=windows) 에서 Community 버전(Professional 버전은 유료)을 다운로드 받아 설치를 진행하면 된다.  별도로 손댈 것 없이 next 만 클릭해도 설치가 완료된다.

 

설치가 완료되면 위와같은 화면을 볼 수 있다.  open 을 클릭하여 우리가 생성했던 django 프로젝트 디렉토리인 C:\projects\mysite 를 선택하면 PyCharm의 프로젝트 화면이 열린다. (위 스크린샷은 다른 경로에 만든 프로젝트이기에 경로가 조금 다르다.)

 

이제 Python 인터프리터를 잡아주기 위해 File > Settings 로 들어간다.

 

Project: mysite의 Project Interpreter 탭에서 우측 상단의 톱니바퀴 모양 버튼을 클릭한 뒤 Add 를 클릭한다.

 

미리 만들어둔 가상환경을 사용하기 위해 Existing environment 에 체크한 뒤 Interpreter 경로를 가상환경을 생성한 경로의 python.exe 파일의 경로로 설정해준다. ok를 누르면 인터프리터의 설정이 완료되고 이제 PyCharm이 우리가 생성한 가상환경 내의 Python 인터프리터를 인식한다.  이것으로 django 로 웹 서버를 개발하기 위한 준비가 모두 갖춰졌다.

 

 

7. 언어/시간 변경

 필수적인 사항은 아니지만 프로젝트의 config 디렉토리 내에 있는 settings.py 를 조금 수정하여 언어와 시간을 수정할 수 있다.  setting.py의 내용 중 LANGUAGE_CODE = 'en-us'  ,  TIME_ZONE = 'UTC' 라는 부분이 있다.

이 부분을 LANGUAGE_CODE = 'ko-kr'  ,  TIME_ZONE = 'Asia/Seoul' 로 바꿔준 뒤 다시 서버를 구동하여 접속해보자

 

python manage.py runserver

영어였던 초기화면이 한글로 변경된 것을 확인할 수 있다.

 mysite 프로젝트의 목표는 Django를 활용하여 간단한 게시판형태의 웹 앱을 만들어보는 것이다.  이번에는 우선 이 프로젝트를 위해 필요한 환경 세팅을 해보기로 한다. 이 프로젝트는 전적으로 Windows 환경에서 이루어진다.

 

1. Python의 설치

 필자는 기존에 Python을 사용하고 있었기 때문에 이미 설치가 되어있지만 완전히 제로상태에서 프로젝트를 시작하는 것을 상정하여 Python의 설치부터 시작하기로 한다. 

먼저 Python 공식 홈페이지 (https://www.python.org/) 에 접속하여 Downloads 탭에 커서를 가져가면 위와 같이 최신 버전의 Python 인스톨러를 다운로드 받을 수 있다.

인스톨러를 실행하여 ③의 체크박스를 체크해준다. 이렇게하면 별도로 환경변수에 Python의 경로를 추가해주지 않아도

어느 위치에서나 커맨드를 통해 Python을 실행할 수 있다. 그리고 ④의 Customize installation을 클릭한다.

Install Now를 클릭하여 바로 설치해도 좋지만 Python3의 기본 설치경로는 보다시피 매우 길어 찾아가기에 불편하다.

 

별도로 건드릴 것 없이 next를 클릭해준다.

 

⑥의 Browse를 클릭하여 경로를 좀더 간단하게 바꿔준다. 필자의 경우 C:\Python39로 설정하였다.

이후 ⑦의 install을 클릭하면 설치가 시작된다.

 

 

2. Python 가상환경의 구축

 Python은 하나의 데스크탑에서 서로 다른 버전의 프로그램이나 라이브러리 등을 사용할 수 있도록 독립된 가상 환경을 구축할 수 있는 기능을 제공한다.  이 프로젝트에서는 큰 의미를 가지지는 않지만 웹 개발을 위해서 꼭 알아둬야 할 기능이라고 하니 제대로 사용하여 프로젝트를 진행해보기로 한다.

① 가상 환경들을 저장해둘 디렉토리를 생성한다. 이름은 virtual environments의 줄임말로 venvs로 하기로 한다.

mkdir venvs

 

② 생성한 venvs 디렉토리로 이동한다.

cd venvs

 

③ Python의 모듈 venv를 사용하여 가상 환경 mysite를 생성한다.

python -m venv mysite

 

④ dir 명령어를 사용하여 mysite 디렉토리(가상환경)가 생성된 것을 확인할 수 있다.

dir

 

 

3. vim 에디터 설치

 이후의 진행을 위해서는 텍스트 에디터가 필요하다. 환경이 윈도우인 만큼 일일히 메모장 등을 열어서 편집할 수도 있지만 명령 프롬프트 상에서 작업을 바로바로 할 수 있는쪽이 편하기 때문에 vim 에디터를 설치하기로 한다.

 

 먼저 vim 공식 홈페이지(https://www.vim.org/)에 접속하여 ①의 다운로드 탭을 클릭한다.

 

그 다음 ②의 current stable version 이라고 소개된 링크를 클릭하면 인스톨러를 다운받을 수 있다.

 

next를 클릭한다.

 

④의 동의여부에 체크한 뒤 next를 클릭한다.

 

⑥의 Create .bat files에 체크한 뒤 next를 클릭한다.  이 항목에 체크하면 별도의 설정없이 vim을 명령 프롬프트에서 사용 가능하다.  이후는 계속해서 next를 클릭한 뒤 install을 클릭해주면 설치가 끝난다.

+ Recent posts