본문 바로가기
개발/파이썬

장고 프로젝트 생성

by Engineer-Lee 2022. 3. 30.
반응형

1. 새 폴더 생성 후 가상환경 만들기                python -m venv [프로젝트 명] 

그 후 가상환경 활성화 하기                          [프로젝트 명]\Scripts\activate

(다시 비활성화 하려면 deactivate를 입력하자)

(가상환경에 설치된 리스트를 확인하려면 pip list를 입력하자 )

 

2. pip install django 를 입력해 장고를 가상환경에 설치하자

 

3. django-admin startproject [프로젝트명] 을 입력해 장고 프로젝트 파일을 만들자 

프로젝트를 만들면 다음과 같은 파일들이 함께 생성된다.

  • manage.py: Django 프로젝트와 다양한 방법으로 상호작용 하는 커맨드라인의 유틸리티 입니다. manage.py 에 대한 자세한 정보는 django-admin and manage.py 에서 확인할 수 있습니다.
  • mysite/ 디렉토리 내부에는 프로젝트를 위한 실제 Python 패키지들이 저장됩니다. 이 디렉토리 내의 이름을 이용하여, (mysite.urls 와 같은 식으로) 프로젝트의 어디서나 Python 패키지들을 임포트할 수 있습니다.
  • mysite/__init__.py: Python으로 하여금 이 디렉토리를 패키지처럼 다루라고 알려주는 용도의 단순한 빈 파일입니다. Python 초심자라면, Python 공식 홈페이지의 패키지를 읽어보세요.
  • mysite/settings.py: 현재 Django 프로젝트의 환경 및 구성을 저장합니다. Django settings에서 환경 설정이 어떻게 동작하는지 확인할 수 있습니다.
  • mysite/urls.py: 현재 Django project 의 URL 선언을 저장합니다. Django 로 작성된 사이트의 “목차” 라고 할 수 있습니다. URL dispatcher 에서 URL 에 대한 자세한 내용을 읽어보세요.
  • mysite/asgi.py: 현재 프로젝트를 서비스하기 위한 ASGI-호환 웹 서버의 진입점입니다. 자세한 내용은 ASGI를 사용하여 배포하는 방법 를 참조하십시오.
  • mysite/wsgi.py: 현재 프로젝트를 서비스하기 위한 WSGI 호환 웹 서버의 진입점입니다. WSGI를 사용하여 배포하는 방법를 읽어보세요.

 

4. 장고 프로젝트가 잘 작동하는지 확인하기 위해 python manage.py runserver를 입력해보자

 

5. 이제 프로젝트를 만들어보자.
프로젝트에 쓰일 앱을 따로 폴더로 만들기위해 python manage.py startapp [app 이름] 를 입력하자

 

만들어진 앱의 폴더 안에는 여러 파일들이 있다.

5-1) admin.py는 admin을 관리하기 위한 파일이다.

5-2) models.py는 데이터베이스 모델을 관리, 접근(CRUD)하기 위한 파일이다.

5-3) views.py는 만약 사용자가 어떤 버튼을 클릭했다고 하면
그 때 back단에서 돌아가는 어떠한 로직들을 관장하는 파일이다.

5-4) apps.py는 앱에 대한 기본 설정 정보를 담고 있는 파일이다.

5-5) test.py는 test case를 다루는 파일이다.

 

 

6. views.py를 작성하자.

ex)

 

 

7. 새로 만든 앱(ex: polls)의 urls.py를 만들자

ex)

 

8. 이번엔 프로젝트의 urls.py를 작성하자

ex)

 

9. 예시 처럼 입력을 하고 python manage.py runserver를 입력해서 실행해보면 아마 page not found가 나올 것이다.

이는 프로젝트 폴더의 urls.py의 url설정이 polls/와 admin/ 뿐이기 때문이다.

따라서 http://127.0.0.1:8000/ 뒤에 polls/를 붙여서
http://127.0.0.1:8000/polls/로 접속한다면 views.py에 입력한 HttpResponse의 문구가 뜰것이다.

 

즉 정리하자면 manage.py로 프로젝트를 실행시키면 mysite안의 urls.py에서 polls.urls로 처리를 보내고

polls앱의 폴더 안 urls.py에서

위 로직에 의해 views파일의 index를 호출시키고 index함수는 설정된 동작을 해준다.

 

 

 

10. 만약 http://127.0.0.1:8000/polls/test/ 라는 url을 동작시키고 싶다면

polls앱의 urls.py에서 

다음과 같이 경로를 추가해주고

 

views.py에선 

def test를 추가해주자

 

 

11. 장고에서는 기본적으로 sqlite를 사용하도록 설정이 되어있다.

만약 설정을 바꾸고싶다면 settings.py에서 DATABASES 딕셔너리를 수정해야한다. (여기에선 우선 sqlite를 그대로 사용하겠다)

  • ENGINE  'django.db.backends.sqlite3', 'django.db.backends.postgresql', 'django.db.backends.mysql', 또는 'django.db.backends.oracle'. 그외에 서드파티 백엔드 참조.

 

12. DB생성을 위해 python manage.py migrate를 입력한다.

 

13. DB모델링하기

 

14. DB모델링한것을 만든 앱의 models.py에 작성하기

ex) 

위 코드로 db를 구성하게 되면 Question 테이블과 Choice 테이블이 생성된다.

 

Question, Choice클래스는 modles의 Model 클래스를 상속받는다.

Choice 클래스는 Question클래스의 키인 question을 외래키로 받는다.

 

외래키를 삭제할 때 on_delete의 옵션은 다음과 같다.

https://vallhalla-edition.tistory.com/60

 

[Django] Django 모델 ForeignKeyField on_delete 종류

on_delete 옵션은 Django에서 모델을 구현할 때 데이터베이스 상에서 참조무결성[각주:1]을 유지하여 ForeignKeyField가 바라보는 값이 삭제될 때 해당 요소를 처리하는 방법을 지정해 준다. CASCADE : Foreig

vallhalla-edition.tistory.com

 

 

장고의 필드 타입들은 다음과 같다.

https://velog.io/@ash3767/django-%EC%A7%80%EC%9B%90%EB%90%98%EB%8A%94-%EB%AA%A8%EB%8D%B8-%ED%95%84%EB%93%9C%ED%83%80%EC%9E%85

 

django models-모델 필드타입

참고자료 https://docs.djangoproject.com/en/3.0/ref/models/fields/AutoField BigAutoFieldCharField max_length 설정이 가능하다 .TextFieldSlugFieldDateFieldTi

velog.io

 

주요 필드 옵션들은 다음과 같다.

 

15. settings.py에 들어가서
INSTALLED_APPS = [
    '[프로젝트 명].apps.[프로젝트 명(첫글자는 대문자)]Config',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

으로 설정하자

 

ex)

 

16. python manage.py makemigrations [앱 이름]를 입력한다.

이를 입력하고나면 migrations 폴더안에 0001_initial.py 파일이 생성된다.

이 파일에서 models.py에 설정한 db모델링이 잘 설정되었는지 볼 수 있다.

 

 

17. python manage.py migrate를 입력한다.

이제 db.sqlite3에 우리가 설정한 스키마대로 db가 생성된다.

 

18. python manage.py shell를 입력해서 데이터베이스api 탐험을 할 수 있다.

ex) Question 테이블에 새로운 데이터를 추가해보고 확인해보고 그 추가한 데이터를 수정해보는 예제이다.

 

19. 18번의 예제를 보면 맨 마지막의 Question.objects.all()로는 질문의 갯수만 알 수 있고 그 질문의 내용을 알 수 없다.

따라서 models.py에서 커스텀 함수를 만들어보겠다.

그 후 쉘에서 나오기 위해 exit()를 입력하고 python manage.py shell를 다시 입력해서 재접속하자

재접속을 하면 다시 18번 예제 코드인 from polls.models import Choice, Question을 입력해야한다.

 

이제 다시 Question.objects.all()를 입력해보면 다음과 같이 휠씬 가독성이 좋아졌다.

 

 

20. models.py에 다음과 같은 함수를 추가하고

다시 python manage.py shell를 실행해보면

이 예제처럼 필터링을 좀 더 유용하게 할 수 있다.

 

 

 

21. python manage.py createsuperuser 를 입력해서 관리자를 생성하자

 

22. http://127.0.0.1:8000/admin/ 를 통해 관리자 페이지로 로그인해서 들어갔더니 우리가 만든 Question에 대한 db의 관리 메뉴가 없고 오로지 Groups와 Users의 기본적으로 제공되는 메뉴만 있는걸 볼 수 있다.

 

 

따라서 앱의 admin.py를 수정해서 Question관리 메뉴를 추가해주자

 

 

 

 

그럼 Questions과 Choice 메뉴가 생긴걸 볼 수 있다. 이 메뉴를 통해 힘겹게 shell를 이용해서 관리할 필요가 없이 GUI 환경해서 편리하게 관리가 가능해졌다.

 

 

23. polls/views.py에 테스트코드용 코드 작성해보자

 

 

 

24. 이 상태로 실행보면 잘 동작이 안될 것이다.

왜냐하면 polls/urls.py도 다음과 같이 수정이 돼야한다.

path('<int: question_id>/' 같은 경우에는 우리가 장고 admin페이지에서 추가한 question들은
자동적으로 양수의 번호를 id값으로 매기게 된다.

따라서 다음과 같은 url을 타고 가면 볼 수 있다

23번 예시처럼 적절하게 views.py에서 설정한대로 출력 문구가 나오는걸 볼 수 있다.

 

 

 

 

25. 자 그럼 이제 views.py가 실제로 의미있는 동작을 하도록 만들자

index함수부분를 수정하여 가장 최신의 질문 5개만 출력하도록 하는 예시이다.

 

결과:

 

 

 

26. 이제 html 파일을 views.py가 띄울수 있도록 템플릿을 만들어보자

polls 앱 안에 templates이라는 폴더를 만들고  templates 폴더 안에 polls라는 폴더를 또 만들고 그 안에 index.html파일을 만들자

 

템플릿에는 아래 코드를 입력한다. (장고는 html파일에서 '진자언어'를 이용한다. )

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

 

 

 

 

views.py의 index함수는 아래처럼 수정한다.

 

from django.shortcuts import render

from .models import Question


def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

 

 

이는 render메소드를 통해 최신 질문 5개가 담긴 리스트를 latest_question_list 리스트변수에 담아서 context로 넘겨주면

템플릿에선 'latest_question_list'가 존재하므로 latest_question_list 리스트변수의 값을 하나씩 꺼내서 화면에 질문에 대한 링크(현재는 views.py에서 detail 함수가 처리하고있음.. 이 또한 템플릿이 프론트엔드부분을 담당하게 수정할 예정)를 출력시켜준다.

 

 

 

 

27. 404 에러 일으키기

우리는 현재 question에 대한 id값이 2번과 3번 뿐이다.

 

그러나 임의로 url에 8번에 해당하는 질문의 결과 페이지를 보려고
http://127.0.0.1:8000/polls/8/results/ 로 접속하면 접속이 돼버린다.

 에러핸들링이 하나도 안된 것이다. 우린 이걸 404 오류를 띄워서 막으려 한다.

 

 

 

우선 views.py의 detail 함수를 아래와 같이 수정해보자

get_object_or_404 메서드를 이용해서 Question 테이블에 데이터가 존재하면 넘겨주고 없다면 404에러를 만들어준다.

 

그리고 화면에 템플릿내용을 띄우기 위해 detail.html를 새로 만들자

 

detail.html안에 

다음과 같은 코드를 작성하자

3번째 줄의 choice_set.all은 파이썬이나 진자언어에서 많이 사용한다. 잘 알아두자 

 

 

결과물은 다음과 같다.

반응형