[답변 등록 폼]

 

질문 상세 템플릿에 답변을 저장할 수 있는 form을 추가해보자.

pybo/question_detail.html 을 다음과 같이 수정하자.

답변의 내용을 입력할 수 있는 textarea 와 답변을 저장 할 수있는 "답변등록" 버튼도 추가했다. 답변 저장을 위한 URL은 form 태그의 action 속성에 {% url 'pybo:answer_create' question.id %} 로 지정했다. form 태그 바로 밑에 있는 {% csrf_token %} 은 보안에 관련된 항목으로 form으로 전송한 데이터가 실제 웹페이지에서 작성한 데이터인지를 판단하는 역할을 한다. 막약 해커가 이상한 방법으로 데이터를 전송할 경우에는 서버에서 발행한 csrf_torkn 값과 해커가 일방적으로 보낸 csrf_token 값이 일치하지 않기 때문에 블로킹 된다. 그럴므로 항상 form 태그 바로 밑에 {% cstf_token %} 태그를 위치 시켜야한다.

 

[URL 매핑]

 

이제 질문 상세 템플릿을 위와 같이 고친 후 질문 상세 페이지를 요청하면

answer_create 별칭을 찾을수 없다는 의미의 오류를 만나게 된다. 그 이유는 질문 상세 템플릿에 {% url 'pybo:answer_create' question.id %} 처럼 pybo:answer_create 별칭을 사용했기 때문이다. 이 오류를 해결하기 위해서는 pybo/urls.py 을 다음과 같이 URL 매핑을 등록해야 한다.

answer_create 별칭에 해당하는 URL 매핑 규칙을 등록했다. 이제 http://localhost:8000/pybo/answer/create/2/ 와 같은 페이지를 요청하면 URL 매핑 규칙에 의해 views.answer_create 함수가 호출된다. 그렇다면 views.answer_create 함수를 만들어줘야 한다. pybo/views.py 파일을 다음과 같이 수정하자.

answer_create 함수의 매개변수 question_id는 URL 매핑에 의해 그 값이 전달된다. 만약 http://localhost:8000/pybo/answer/create/2/ 라는 페이지를 요청하면 매개변수 question_id 에는 2 라는 값이 전달된다.

그리고 답변 등록시 텍스트창에 입력한 내용은 answer_create 함수의 첫번째 매개변수인 request 객체를 통해 읽을 수 있다. 즉, request.POST.get('content') 로 텍스트창에 입력한 내용을 읽을 수 있다는 뜻이다. request.POST.get('content') 는 POST로 전송된 form 데이터 항목 중 content 값을 의미한다. 그리고 답변을 생성하기 위해 question.answer_set.create를 사용했다. question.answer_set 은 질문의 답변을 의미한다. Question 과 Answer 모델은 서로 ForeignKey 로 연결되어 있기 때문에 이처럼 사용할 수 있다. 

 

답변을 저장하는 또 다른 방법은 다음처럼 Answer 모델을 직접 사용하는 방법이다.

필요없는 부분은 주석처리 했다

원래 적었던 부분은 주석처리 했다. 답변을 생성한 후 질문 상세 화면을 다시 보여주기 위해 redirect 함수를 사용했다. redirect 함수는 페이지 이동을 위한 함수이다. pybo:detail 별칭에 해당하는 페이지로 이동하기 위해 redirect 함수를 사용했다. pybo:detail 별칭에 해당하는 URL은 question_id 가 필요하므로 question.id 를 인수로 전달했다.

 

[답변 저장]

 

이제 질문 상세 화면을 호출해 보자.

텍스트 창에 아무 값이나 입력하고 답변을 등록하자. 그런데 등록해도 화면에 아무런 변화가 없다. 그 이유는 아직 등록된 답변을 표시하는 기능을 템플릿에 추가하지 않았기 때문이다.

 

[답변 조회]

 

등록된 답변을 질문 상세 화면에 표시하려면 pybo/question_detail.html 을 다음과 같이 수정하자.

 중간 부분에 질문에 등록된 답변을 확일할 수 있는 영역을 추가했다. question.answer_set.count 는 답변의 총 갯수를 뜻한다.

이제 다시 질문 상세 화면을 호출하면

실수로 비슷한 답변을 2개 달아서 2개가 나온다

이제 답변을 저장하고 확인까지 할수있게 되었다!

'Django > 따라하는 장고' 카테고리의 다른 글

12. 부트스트랩  (0) 2022.10.27
11. 스태틱 디렉토리  (0) 2022.10.25
9. URL 별칭  (0) 2022.10.20
8. 템플릿  (1) 2022.10.19
7. 장고 관리자  (1) 2022.10.17

[URL 하드 코딩]

 

question_list.html 템플릿에 사용된 다음 링크를 보자.

질문 상세를 위한 URL 링크이다. 하지만 이러한 URL 링크는 수정될 가능성이 있다. 예를 들어 http://localhost:8000/pybo/question/2 또는 http://localhost:8000/pybo/2/question 처럼 바뀔수 있다. 실제 프로젝트에서 이러한 URL 리팩토링은 빈번하게 발생한다. URL 링크가 자주 변경된다면 템플릿에서 사용한 모든 URL 들을 일일이 찾아가며 수정해야 하는 리스크가 발생한다. 이러한 문제점을 해결하기 위해서는 해당 URL에 대한 실제 링크 대신 링크의 주소가 1:1 매핑되어 있는 별칭을 사용해야 한다.

 

링크의 주소 대신 별칭을 사용하려면 URL 매핑에 name 속성을 부여해야한다. pybbo/urls.py 파일을 수정하자.

http://localhost:8000/pybo/ URL 은 index 별칭을 부여했고,

http://localhost:8000/pybo/2 와 같은 URL 은 detail 이라는 별칭을 부여했다는 뜻이다.

 

이렇게 별칭을 추가하면 템플릿에서 다음처럼 사용할 수 있다.

하드코딩 되어 있던 /pybo/{{ question.id }} 링크를 {% url 'detail' question.id %} 로 변경했다. 여기서 question.id 는 URL매핑에 정의된 <int:question_id>에 전달해야 하는 값을 의미한다.

 

현재는 pybo 앱 하나만 사용중이지만 pybo 앱 외에 다른 앱이 프로젝트에 추가 될 경우 서로 다른 앱에서 동일한 URL 별칭을 사용하면 중복이 발생한다. 이 문제를 해결하려면 pybo/urls.py파일에 네임스페이스를 의미하는 app_name 변수를 지정해야한다.

app_name 을 pybo 로 설정했다. 그런데 이렇게 수정하고 http://localhost:8000/pybo/ 에 접속하면

이런 오류가 발생한다. 이 오류는 네임스페이스를 추가했기 때문이다. 이 오류를 해결하려면 템플릿에서 사용한 URL 별칭에 네임스페이스를 다음과 같이 지정해야한다.

detail 앞에 pybo 라는 네임스페이스를 붙여준 것이다.

'Django > 따라하는 장고' 카테고리의 다른 글

11. 스태틱 디렉토리  (0) 2022.10.25
10. 답변 등록하기  (0) 2022.10.22
8. 템플릿  (1) 2022.10.19
7. 장고 관리자  (1) 2022.10.17
6. 모델 사용법  (0) 2022.10.13

[질문 목록]

 

http://localhost:8000/pybo/ 페이지에 들어가면 등록한 질문을 볼 수 있도록 구현해 보자.

pybo/views.py 파일의 index 함수를 다음과 같이 수정하자.

 

질문 목록 데이터는 Question.objects.order_by('-create_date') 로 얻을 수 있다. order_by는 조회 결과를 정렬하는 함수이다. order_by('-create_date')는 작성일시 역순으로 정령하라는 의미이다. "  -  " 기호가 붙어 있으면 역방향, 없으면 순방향 정렬을 의미한다. 게시물은 보통 최신순으로 보기 때문에 작성일시의 역순으로 정렬한다.

 

render 함수는 파이썬 데이터를 템플릿에 적용하여 HTML로 반환하는 함수이다. 즉, 위에서 사용한 render 함수는 질문 목록으로 조회한 question_list  데이터를 pybo/question_list.html 파일에 적용하여 HTML을 생성한 후 리턴한다. 여기서 사용된 pybo/question_list.html과 같은 파일을 템플릿이라고 부른다. 템플릿 파일은 HTML 파일과 비슷하지만 파이썬 데이터를 읽어서 사용할 수 있는 HTML 파일이다. 

 

[템플릿 디렉토리]

 

render 함수에서 사용한 pybo/question_list.html 템플릿 파일을 작성해야 한다. 하지만 템플릿 파일을 작성하기 전에 템플릿 파일을 저장할 디렉토리를 먼저 만들어야 한다. 템플릿을 저장 할 디렉토리는 config/settings.py 파일의 TEMPLATES 항목에 설정해야 한다.

DIR는 템플릿 디렉토리를 여러개 등록할 수 있도록 리스트로 되어 있다. 파이보는 BASE_DIR/'templates' 디렉토리 한 개만 등록한다. 여기서 BASE_DIR 은 /Users/h<사용자명>/projects/mysite 이다.

결론적으로 전체 경로는 /Users/<사용자명 >/projects/mysite/templates 이다. 이  디렉토리는 없으므로 다음과 같이 생성하자.

가상 공간 (mysite) 에서 만들자

가상공간에서 mkdir templates 명령어를 수행한다. 장고는 DIRS에 설정한 디렉토리 외에도 앱 디렉토리 바로 하위에 있는 templates 디렉토리도 템플릿 디렉토리로 인식한다.  즉, pybo 앱의 경우 projects/mysite/pybo/templates 이러한 디렉토리를 생성하면 별다른 설정없이 템플릿 디렉토리로 인식한다.

 

하지만 이처럼 앱 디렉토리 하위에 템플릿 디렉토리를 두는 방법을 권장하지 않는다. 그 이유는 하나의 웹 사이트에서 여러 앱을 사용할 때 여러 앱의 화면을 구성하는 템플릿은 한 디렉토리에 모아 관리하는 편이 여러모로 좋다. 그러므로 pybo 앱은 템플릭 디렉토리로 projects/mysite/pybo/templates 가 아닌 /projects/mysite/templates/pybo 디렉토리를 사용한다. 그리고 공통으로 사용하는 템플릿은 projects/mysite/templates 위치에 저장한다.

모든 앱이 공통으로 사용할 템플릿 디렉토리 - projects/mysite/templates
pybo 앱이 사용할 템플릿 디렉토리 - projects/mysite/templates/pybo
common 앱이 사용할 템플릿 디렉토리 - projects/mysite/templates/common

 

[템플릿 파일]

 

이제 템플릿 파일을 만들어 보자. render 함수에서 사용한 템플릿 파일명은 pybo/question_list.html 이다.

따라서 question_list.html 파일은 projects/mysite/templates/pybo/question_list.html 경로에 작성해야 한다.

그 후 pybo/question_list.html 파일을 다음과 같이 작성하자.

오타가 있다 />pybo/ 가아니라 /pybo/ 이다.

템플릿을 보면 {% 와 %} 로 둘러쌓인 문장이 있는데 이것을 템플릿 태그라고 한다. 여기에 사용된 템플릿 태그들을 하나씩 살펴보자면

{% if question_list %} : question_list 가 있다면
{% for question in question_list %} : question_list를 순회하며 순차적으로 하나씩 question 에 대입
{{ question.id }} : for 문에 의해 대입된 question 객체의 id 번호를 출력
{{ question.subject }} : for 문에 의해 대입된 question 객체의 제목을 출력

템플릿에서 사용한 question_list 는 render 함수로 전달한 질문 목록 데이터이다.

 

[템플릿 태그]

 

장고에서 사용하는 템플릿 태그는 3가지 유형만 알면된다.

 

1. 분기

{% if 조건문1 %}
    <p>조건문1에 해당되는 경우</p>
{% elfi 조건문2 %}
    <p>조건문2에 해당되는 경우</p>
{% else %}
    <p>조건문1, 2 에 모두 해당되지 않는 경우</p>
{% endif %}

파이썬의 if 문과 비슷하다. 다만 항상 {% endif %} 태그로 닫아주는것을 잊지 말자.

 

2. 반복

{% for item in list %}
    <p>순서 : {{ forloop.counter }} </p>
    <p>{{ item }}</p>
{% endfor %}
forloop.counter : 루프내의 순서로 1부터 표시
forloop.counter0 : 루프내의 순서로 0부터 표시
forloop.first : 루프의 첫번째 순서인 경우 True
forloop.last : 루프의 마지막 순서인 경우 True

 

3. 객체 출력

{{ 객체 }}

ex) {{ item }}

 

객체에 속성이 있는 경우는 파이썬과 동일한 방법으로 도트(.) 문자를 이용하여 표시하면 된다.

{{ 객체.속성 }}

ex) {{ question.id }}, {{ question.subject }}

 

[테스트]

 

템플릿 디렉토리 추가 후에는 로컬 서버를 재시작 해야 한다.

여기까지 수정하고 로컬 서버를 재시작 후 http://localhost:8000/pybo/ 페이지를 요청하면 다음과 같은 화면이 나온다.

이전에 등록한 질문 2건이 조회된다. 이제 질문 목록 중 한개를 선택해보면

%3EPybo랑 />pybo/ 라고 나온것은 무시하자. 오타이다.

이러한 오류가 나온다. http://localhost:8000/pybo/2/ 에 대한 URL 매핑이 아직 없기 때문이다.

 저 URL 의 의미는 id 값이 2 인 Question 을 상세 조회한다는 뜻이다. 이 URL 이 작동할 수 있도록 pybo/urls.py 파일을 수정하자.

추가한 라인의 뜻은 http://localhost:8000/pybo/2/ 페이지가 요청되면 여기에 등록한 매핑 룰에 의해 http://localhost:8000/pybo/<int:question_id/> 가 적용되어 question_id 에 2가 저장되고 views.detail 함수도 실행된다.

 

이제 위의 URL 매핑 규칙에 의해 실행되는. views.detail 함수를 만들어야 한다. pybo/views.py 파일에 detail 함수를 추가하자.

index 함수와 크게 다른 부분은 없다. 다만 detail 함수 호출시 전달되는 매개변수가 request 외에 question_id 가 추가되었다. 매개변수 request_id 에는 URL 매핑시 저장된 question_id 가 전달된다.

 

 

detail 함수에서 사용할 pybo/question_detail.html 템플릿도 작성해야한다.

projects/mysite/templates/pybo/question_detail.html 을 만들고 다음과 같이 작성하자.

{{ question.subject }} 과 {{ question.content }}의 question은 detail 함수에서 템플릿에 context 변수로 전달된 Question 모델 객체이다.

 

여기까지 했다면 다시 페이지를 요청해보자.

질문 상세 기능을 만들었다!

 

 

[오류 페이지]

 

이제는 오류 페이지를 만들어보자.

http://localhost:8000/pybo/30/ 페이지를 요청했을때의 모습이다. DoesNotExist 오류가 발생한다. 이 오류는 전달된 question_id 가 30이기 때문에 Question.object.get(id=30)이 호출되어 발생한 오류이다. 이때 브라우저에 전달되는 오류코드는 500이다.

 

이런식으로 없는 데이터를 요청할 경우 500 오류 페이지 보다는 "Not Found(404)" 페이지를 리턴하는것이 좋다.

 

[HTTP 주요 응답 코드의 종류]
오류코드 200 = 성공
오류코드 500 = 서버오류(Internal Server Error)
오류코드 404| = 서버가 요청한 페이지를 찾을수 없음(Not Found)

방금 처럼 없는 데이터를 요청할 경우 404 페이지를 출력하도록 detail 함수를 수정해보자.

수정한 pk=question_id 에서 pk 는 Question 모델의 기본 키(Primary Key) 에 해당하는 값이다. 이렇게 수정하고 다시 페이지를 요청해보자.

404 오류 페이지 출력으로 변경되었다.

'Django > 따라하는 장고' 카테고리의 다른 글

10. 답변 등록하기  (0) 2022.10.22
9. URL 별칭  (0) 2022.10.20
7. 장고 관리자  (1) 2022.10.17
6. 모델 사용법  (0) 2022.10.13
5. 장고 모델 작성법  (0) 2022.10.13

[장고 관리자 생성]

 

장고 관리자를 생성하기 위해서는 슈퍼유저를 먼저 생성해야한다. python manage.py createsuperuser 명령어를 수행해보자.

일단 아이디는 admin 비밀번호는 1111로 설정하였다.

관리자 계정이 생성 되었으니 로컬 서버를 구동한 후 http://localhost:8000/admin 페이지로 접속해보자.

admin 페이지에 로그인 화면이 나오면 아까 만들었던 슈퍼유저 계정을 입력해서 로그인 하면 

이런 화면으로 접속이 된다.

 

[모델 관리]

 

장고 관리자 계정에 저번에 만들었던 모델들을 등록해보자. pybo 앱 디렉토리에 admin.py 파일이 있다.

admin.site.register 로 Question 모델을 등록했다. 그 후 관리자 화면을 새로고침 해보면 Question 이 추가 되었다.

이제 관리자 화면에서 Question 모델을 관리 할 수 있다. 신규 질문을 생성하고 조회, 수정, 삭제할 수 있다. Question 모델의 '+추가' 링크를 클릭해보면 새로 추가하는 화면이 나온다. 제목, 내용을 추가하고 create_date 는 '오늘', '현재' 버튼을 클릭하면 자동 입력이 된다. 그 후 저장하자.

성공적으로 추가 되었다. Answer 모델도 마찬가지로 관리할 수 있다.

 

[모델 검색 기능]

 

pybo/admin.py를 열어 다음과 같이 수정해보자.

class QuestionAdmin(admin.ModelAdmin) :
       search_fields = ['subject']

명령어를 추가해 Question 모델에 세부 기능을 추가할 수 있는 QuestionAdmin 클래스를 생성하고 제목 검색을 위해 search_fields 속성에 'subject' 를 추가했다. 이렇게 하면 검색 기능이 추가된 화면을 볼 수 있다.

검색어로 '모델' 을 입력하고 검색을 하면 제목에 '모델'이 들어간 질문만 나온다. 이 외에 무수히 많은 장고 관리자 기능이 있다.

 

The Django admin site | Django documentation | Django

Django The web framework for perfectionists with deadlines. Toggle theme (current theme: auto) Toggle theme (current theme: light) Toggle theme (current theme: dark) Toggle Light / Dark / Auto color theme Overview Download Documentation News Community Code

docs.djangoproject.com

 해당 링크를 참고해 확인하자.

'Django > 따라하는 장고' 카테고리의 다른 글

9. URL 별칭  (0) 2022.10.20
8. 템플릿  (1) 2022.10.19
6. 모델 사용법  (0) 2022.10.13
5. 장고 모델 작성법  (0) 2022.10.13
4. 파이참의 기본 요소  (0) 2022.10.12

[ 모델 사용법 ]

 

전에 모델을 만들어 보았으니 이제 사용법을 장고 셸로 배워보자. 일단 python manage.py shell 명령어로 장고 셸을 열자.

명령어를 입력하면 셸이 열린다. 반드시 장고 셸로 실행해야하는 이유는 장고 셸에는 장고에 필요한 환경들이 자동으로 설정되어 실행되기 때문이다.

 

장고 셸에 Question, Answer 모델을 import 해서 사용한다. 장교 셸에 from pybo.models import Question, Answer 명령어를 수행하자. 그 후 일단 Question 모델을 이용해 질문 데이터를 만들어보자.

question,answer 모델을 import 한후, create_date 에 적어넣을 timezone 도 import 한다. 객체 Question모델의 객체q 를 생성한후  속성들을 채워넣는다.create_date 의 속성은 DateTimeField 타입이므로 timezone.now()로 현재시간을 대입하였다. q.save()로 저장을 하면 데이터 하나가 생성된다. q.id로 확인을해보면 id 값이 생긴걸 확인할 수 있다. id 는 모델 데이터의 유일한 값으로 프라이머리 키 (PK) 라고도 한다. 이 값은 데이터를 생성할 때마다 1씩 증가된다.

질문을 하나 더 만들어보자.

실수를 한 부분이 있다

사진을 보면 q.save 를 했는데 경고문이 뜨면서 저장이 앉되서 해맨 흔적이 있다. q.save 가 아니라 q.save() 를 해야한다. 나처럼 실수하는 사람이 없기를 바라는 마음으로 올려보았다. 질문을 하나 더 작성하니 q.id 가 2가 된것을 확인할 수 있다.

 

이제 만든 데이터들을 조회해 보자. Question.objects.all() 명령어를 쳐보자.

이번이도 오타가나서 경고문이 나타났었다

오타가 발생해서 실행이 제대로 되지않게 명령어를 제대로 입력해야한다. Question모델의 데이터는 Question.objects를 통해서 조회할수 있고 뒤에붙은 .all()은 모든 데이터를 조회하는 함수이다. 명령을 수행하면  QuerySet의 객체가 리턴된다. 이것들은 Question 객체를 포함한다. 객체 안에 1 과 2 는 데이터의 id 값이다. 뒤에 id 값이 아닌 제목을 표시하고싶다면 Question 모델에 __str__ 메서드를. 추가하면 id 값 대신 제목을 표시할 수 있다.

pybo/models.py 에

def __str__(self):
    return self.subject

를 추가하면 된다. Question 모델을 변경하려는 것이였으므로 Question 모델 안에다가 작성해야만한다. 그리고 모델이 변경되었으므로 장고 셸을 재시작해야 변경된 결과를 확인할 수 있다. 

장고 셸을 재시작후 다시 모델들을 import 한후 Question.obbjects.all() 을 하면 이전과 달리 제목이 표시 된다. 모델의 메서드가 추가된 경우에는 makemigrations, migrate 를 수행할 필요가 없다. makemigrations, migrate 는 모델의 속성이 변경되었을 경우에 사용하는것이다.

 

filter 함수를 사용해 id 값이 1 인 데이터를 조회해보면

id 값은 유일한 값이기 때문에 get 함수를 이용해도 비슷한 결과를 얻을수 있다. 하지만 filter 함수는 filter함수에 맞는 여러개가 리턴되기때문에 QuerySet 이 리턴된다. get 함수는 Question 모델 객체가 리턴된다. get 함수는 조건에 맞는 데이터가 1개일 경우일때 사용한다. 데이터가 여러개일때 get 함수를 사용하면 오류가 난다.  보통 get 함수는 id 와 같은 유일한 값으로 조회할 경우에만 사용한다.

filter 함수를 사용해 subject에 'pybo' 라는 문자열이 포함된 데이터만 조회할수도 있다.

filter 함수는 이것 말고도 다양하다.

filter 함수 사용법은 장고 공식 문서를 참조해서 더 알아보자. 장고 공식 문서는 장고 개발시 필수로 참조해야하는 문서이다.

https://docs.djangoproject.com/en/4.0/topics/db/queries/

 

Making queries | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

이제 Question 데이터를 수정해보자. 일단 id값이 1 인 데이터를 조회해보자.

id 값이 1인 데이터를 q 에 초기화후 subject 속성을 수정후 저장한후 q내용을 확인해 보면 변경된 것을 알수있다.

 

이번엔 id값이 1 인 Question 데이터를 삭제해보자. 먼저 id값이 1 인 데이터를 조회하자.

q 에 id 값이 1인 데이터를 초기화후 q.delete() 하면 (1, {'pybo.Question': 1}) 이 출력된다. 이는 Question 모델이 1개 삭제 되었다는것을 의미한다. 그후 질문 모델 전체를 조회해보면 질문이 삭제되고 하나만 남은것을 알 수 있다.

 

이제 답변을 해보자. Question 데이터를 작성하고 조회하고 수정하고 삭제한것과 비슷하다. 먼저 id 값이 1 인 질문 데이터는 삭제했으므로 id 값이 2인 데이터를 조회해서 데이터를 작성해보자.

q에 id값이 2인 Question 데이터를 넣고, a에 Answer 데이터를 작성한후 저장하자. a.id 를 보면 id 가 1이 된것을 볼수있다.

 

Question 때와 같이 id 값을 이용해 데이터를 찾을 수 있다.

Answer 모델의 속성을 이용해 다양한 정보를 조회할 수 있다.

 

질문을 이용하여 답변을 찾는것도 가능하다.

q.answer_set.all() 명령을 하면 질문에 연결된 답변 모두를 가져올 수 있다. Question 모델에는 answer_set이라는 속성은 없지만 Answer 모델에는 Question 모델이 ForeignKey로 연결되어 있기 때문에 q.answer_set 과 같은 접근이 가능하다. 하지만 반대로는 불가능하다. 상식적으로 질문하나에는 여러개의 답변이 가능하므로 q.answer_set 이 가능하지만 답변하나에는 여러개 질문이 있을수 없으므로 a.question_set 은 불가능하다. 답변하나에는 질문 하나만 가능하기 때문에 a.question 만 가능하다.

 

'Django > 따라하는 장고' 카테고리의 다른 글

8. 템플릿  (1) 2022.10.19
7. 장고 관리자  (1) 2022.10.17
5. 장고 모델 작성법  (0) 2022.10.13
4. 파이참의 기본 요소  (0) 2022.10.12
3. 파이참 사용하기  (0) 2022.10.11

[ migrate ]

 

장고는 모델을 이용해 데이터베이스를 처리한다.

python manage.py runserver 실행시 나오는 문구를 보면 

빨간 글자로 경고문이 나온다

18개의 적용되지않은 mirgrations 들이 있다. admin, auth, contenttypes, sessions 앱에 migration을 적용하기전까지 프로젝트가 정상적으로 작동하지 않을것이라고 한다. python manage.py migrate 명령어로 적용하라고 한다. admin, auth, contenttypes, sessions 앱들은 장고 프로젝트 생성시 기본설치되는 앱이다. 설치된 앱은 config/settings.py 에 적혀있다. 

config/settings.py 를 잘 살펴보자

경고문에 적힌 앱들말고도 messages, staticfiles 앱들도 있는데 이 두개의 앱은 데이터베이스와 관련이 없어서 경고문에 나오지 않은것이라고 한다. 

config/settings.py 파일을 잘 살펴보면 데이터베이스에 관한 정보도 같이 들어있다.

데이터베이스의 엔진은 django.cbb.backends.sqlite3 이고 데이터베이스 파일의 위치는 BASE_DIR 디렉토리 밑에 db.sqlite3 파일에 저장되어있다. BASE_DIR은 프로젝트 디렉토리로 나는 /Users/<사용자명>/projects/mysite 이다.

이제 경고문이 하라는대로 python manage.py migrate 명령을 실행해 해당하는 앱들이 필요로 하는 데이터베이스 테이블들을 생성하자.

자동으로 진행이 된다

명령어를 실행하면 각 앱들이 사용하는 테이블들이 자동으로 생성된다.

 

[ DB Browser for SQLite ]

 

생성된 테이블들은 SQLite 의 GUI 도구인 "DB Browser for SQLite"를 설치하면 볼수 있다.

https://sqlitebrowser.org/dl/ 링크에 들어가 설치를 하자.

첫 화면이 나온다

[ 데이터베이스 열기 -> /Users/<사용자명>/projects/mysite/db.sqlite3 ] 파일을 선택하자.

이런 화면이 나온다

정확히 무슨 내용인지 자세히 볼 필요는 없다. 장고의 장점 중 하나는 테이블 작업을 위해 직접 쿼리문을 수행하지 않아도 된다는 점이다. 장고의 ORM을 사용하면 쿼리문을 몰라도 데이터 작업을 쉽게 할 수 있다. 여기서 쿼리문이란 데이터베이스의 데이터를 생성, 조회, 수정, 삭제하기위해 사용하는 문법이다.

 

[ 모델 작성법 ]

 

우리가 만드는 pybo 라는 게시판은 질문과 답변을 할 수 있는 파이썬 게시판 서비스이다. 그러므로 질문과 답변에 해당하는 데이터 모델이 있어야만 한다.

 

질문과 답변 모델에는 어떤 속성들이 필요할까? 만드는 사람에 따라 다르겠지만 일반적으로 질문의 제목,질문의 내용, 질문한 날짜 가 필요하고 답변에는 받은 질문,답변의 내용,답변한 날짜가 필요하다. 

정리해보자면 

Question 모델에 들어갈 속성들은 : subject,content,create_date 가 들어가고

Answer 모델에 들어갈 속성들은 : question, content,create_date 속성들이 들어갈 것이다. 이것을바탕으로 pybo/models.py 에 작성해보면

보면 대충 이해할 수 있는데, Question 모델에 subject(제목)속성, content(내용)속성, create_date(작성날짜)속성이 들어있고, subject에는 최대 200글자까지 가능한 CharField()를 사용했고, content에는 글자수 제한이 없는 TextField()를 사용했고, create_date 속성에는 날짜와시간에 관계된 속성인 DateTimeField 를 사용했다.

 

Answer 모델에는 질문에 답변을 해야하므로 Question 모델을 속성으로 가진다. 기존의 모델을 속성으로 연결을 하려면 ForeignKey 를 사용해야한다. on_delete=models.CACADE 는 Answer 모델과 연결된 Question, 질문이 삭제 될 경우 답변도 같이 삭제된다는 의미이다. 

 

[ 테이블 생성 ]

 

이제 이 모델들을 이용해 테이블을 생성해야한다. 일단 config/setting.py 에있는 저번에 봤던 INSTALLED_APPS 에 항목을 추가해야한다.

맨 윗줄에 추가했다

추가한 pybo.apps.PyboConfig 클래스는 pybo/apps.py 파일에 있는 클래스이다. pybo 앱 생성시 자동으로 만들어지는 파일이라 따로 만들 필요는없다. 

 

이제 테이블 생성을 위해 python manage.py migrate 명령어를 쳐보면,

또 경고문이 나온다

경고문의 의미는 pybo 가 아직 migration 에 반영되지 않는 변경 사항이 있으므로 적용되지 않는다. 'manage.py makemigrations' 명령어를 수행해서 새 migrations 를 만들고, 'manage.py migrate' 명령을 다시 수행해서 적용시켜라. 라는 뜻이다. 그럼 하라는대로 python manage.py makemigrations 명령을 수행하면,

model Question 과 Answer과 생성되었다

makemigrations 명령어는 모델을 생성하거나 변화가 있었을 경우에 실행해야 하는 명령이다. 위 명령을 실행하면 pybo/migrations/0001_initail.py 파일이 자동으로 생성된다.

 

이제 다시 python manage.py migrate 명령어를 수행하면

이제야 문제없이 된다

경고문이 안뜨고 명령어가 잘 실행된다. migrate 명령으로 실제 테이블을 생성한것이다. 오류없이 잘 실행된것을 확인하려 전에 깔았던 

DB Browser for SQLite를 확인해보면,

테이블들이 추가되었다

question 테이블과 answer 테이블이 잘 추가된것을 확인할 수 있다.

'Django > 따라하는 장고' 카테고리의 다른 글

7. 장고 관리자  (1) 2022.10.17
6. 모델 사용법  (0) 2022.10.13
4. 파이참의 기본 요소  (0) 2022.10.12
3. 파이참 사용하기  (0) 2022.10.11
2. 장고 프로젝트 생성  (0) 2022.10.11

이전에 프로젝트를 만들었지만 프로젝트에 기능을 추가하기 위해서는 앱을 생성해야한다.

(mysite) stdiohan@stdiohan-MacBookPro mysite % django-admin startapp pybo
(mysite) stdiohan@stdiohan-MacBookPro mysite %

파이참 터미널에 django-admin startapp pybo 를 입력해 앱을 생성한다.

왼쪽 탭을 확인해보면 pybo 디렉토리와 하위 파일들이 생성되었다

브라우저에서 http://localhost:8000/pybo 페이지를 요청했을때 "안녕하세요 pybo입니다." 라는 문자열을 출력해보자

먼저 터미널에 python manage.py runserver 를 입력해 로컬서버를 구동한다.

(mysite) stdiohan@stdiohan-MacBookPro mysite % python manage.py runserver

그후 브라우저에 http://localhost:8000/pybo  를 검색하면

Page not found(404) 오류가 나온다

장고는 오류가 발생하면 오류의 원인을 화면에 자세히 보여주어서 오류를 파악하기가 쉽다. 오류를 해석하면 요청한 URL은 http://localhost:8000/pybo 이다. 오류 해결방법은 config.urls 파일안에 URLconf를 정의하라고 나온다. 그렇다면 그대로 해주면 된다. urls.py 파일은 페이지 요청이 발생하면 가장 먼저 호출되는 파일이다.

config.urls 파일은 projects/mysite/config/urls.py 에 있다.

urls.py 파일을 찾아 수정해준다

19줄에 from pybo import views , 23줄에 path('pybo/', views.index), 를 추가해준 모습이다. 의미는 'pybo/' 라는 URL이 요청되면 views.index 를 호출하라는 매핑을 urlpatterns 에 추가한것이다. views.index 는 views.py 파일의 index 함수이다. pybo/ 에 / 를 추가하는 이유는 URL 을 정규화하는 장고의 기능 때문이다.

아직 views.index 를 설정하지 않았기 때문에 이 상황에서 다시 페이지를 요청하면 페이지 연결 실패가 나올것이다.

views.py 파일을 수정한 모습이다

views.py 파일에

from django.http import HttpResponse

def index(request) :
        return HttpResponse("안녕하세요 pybo입니다.")

를 작성해 넣어보자 HttpResponse는 요청에 대한 응답을 할때 사용한다. index 함수의 매개변수 request 는 HTTP요청 객체이다.

작성을 했으면 다시 페이지를 요청해보자.

설정한 문자열이 정상적으로 출력된 모습이다

 

지금까지 한 이 과정들은 앞으로 장고를 개발할때 반복하는 계속 반복하는 과정이다.

 

[URL 분리방법]

 

urls.py 파일을 수정해서 앞으로 pybo/page1/create 등 이런형식의 URL을 추가해야할때 config/urls.py 를 수정할 필요없이 pybo/urls.py 만 수정해 작동할수있게 해보자.

config/urls.py 를 수정한것이다

전에 적었던 urls.py 와 달라진것이 보일것이다. path('pybo/', include('pybo.urls')) 의 의미는 pybo/ 로 시작하는 페이지를 요청하면 알아서 pybo/urls.py의 파일의 매핑정보를 읽어서 처리하라는 뜻이다. pybo/urls.py 파일 보고 처리하라고 했으니 파일을 만들자.

Pybo폴더에 마우스 오른쪽 클릭 - New - File 을 한 후 파일명을 urls.py 로 파일을 만든다. 그리고 파일 안에는

사진과 같이 파일을 수정하자

사진과 같이 파일내용을 추가하자. path('',views.index) 을 보면  이전에 설정한 config/urls.py 과 다른 부분은 이 있다. 저번에 적었던 'pybo/' 가 생략되고 '' 가 들어간 이유는 이미 config/urls.py 파일에서 이미 pybo/ 로 시작하는 URL이 pybo/urls.py 파일과 먼저 매핑되었기 때문이다.

config/urls.py 에 입력한 pybo/ 와 이번에 적은 '' 이 합쳐져 최종 URL 이 'pybo/' 가 되는것이다. 만약 다른 URL 을 추가해 pybo/page1/ 을 만들고싶다면 config/urls.py 에 적은 pybo/ 와 pybo/urls.py 에 새로 양식에 맞게 'page1/' 을 적어 넣는다면 최종 URL 은 config/urls.py 에 적은 pybo/ 와 pybo/urls.py 에 적은 page1/ 이 합쳐져 pybo/page1/ 이 되는것이다.

오류가 발생한다면 로컬서버를 재시작 하면 해결된다.

 

 

 

 

'Django > 따라하는 장고' 카테고리의 다른 글

6. 모델 사용법  (0) 2022.10.13
5. 장고 모델 작성법  (0) 2022.10.13
3. 파이참 사용하기  (0) 2022.10.11
2. 장고 프로젝트 생성  (0) 2022.10.11
1. 파이썬과 장고설치  (1) 2022.10.10

파이참은 파이썬과 장고개발에 도움을 주는 통합개발환경이다. 

https://www.jetbrains.com/ko-kr/pycharm/download/#section=mac

 

다운로드 PyCharm: JetBrains가 만든 전문 개발자용 Python IDE

 

www.jetbrains.com

사이트에 들어가 자신의 환경에 맞는 dmg 파일을 다운로드하여 설치하면 된다. 어떤 dmg 파일을 설치해야하는지 모르겠다면

터미널에 uname -p 명령어를 실행하면 된다.i386 또는 x86_64라고 출력되면 intel을 다운로드하면되고 arm64가 출력되면 apple silicon 을 다운로드하면 된다.

우 상단에 open버튼을 눌러 프로젝트를 선택한다

open 을 눌러 앞서 생성한 장고 프로젝트인 /Users/<사용자명>/projects/mysite 를 선택한다.

실행된 모습이다

파이참으로 장고 프로젝트를 불러온후 먼저 프로젝트가 바라봐야할 파이썬 인터프리터 위치를 설정해야한다.

PyCharm -> preferences 를 선택하자 

사진에 나온메뉴로 들어가자

우 상단에 Add interpreter를 눌러 add local interpreter 를 선택하자.

add local interpreter 를 누른모습

Virtualenv Environment탭에서 New 를 선택후 Base interpreter 탭에 ... 을 눌러 /Users/<사용자명>/venvs/mysite/bin/python 을 선택한후 모두 OK를 눌러 설정을 마친다.

설정을 모두 한후 맛보기로 설정값들을 수정해보자

왼쪽탭에 settings.py 를 더블클릭한 화면이다

settings.py 파일을 열어 아래로 내려보면 LANGUAGE_CODE 를 사진과 같이 'ko-kr', TIME_ZONE 을 'Asia/Seoul' 로 수정한후 서버를 다시 구동해보자. 파이참 맨 아래 탭에 Terminal 버튼을 클릭하면 Terminal을 열수있다. 사진과 같이 터미널에서 가상환경으로 진입후 

python manage.py runserver

를 실행하면 서버가 다시 구동된다.

이전과 다르게 한글로 나오는 모습

한글로 변경된다면 성공이다.

'Django > 따라하는 장고' 카테고리의 다른 글

5. 장고 모델 작성법  (0) 2022.10.13
4. 파이참의 기본 요소  (0) 2022.10.12
2. 장고 프로젝트 생성  (0) 2022.10.11
1. 파이썬과 장고설치  (1) 2022.10.10
0. 따라하는 장고  (0) 2022.10.10

+ Recent posts