주소와 화면을 연결하는 URL과 뷰
pybo 앱 생성하기
- 터미널에서 cd mysite로 이동하여 아래 명령어 실행하여 pybo 생성
django-admin startapp pybo
config/urls.py 수정하기
from django.contrib import admin
from django.urls import path
from pybo import views
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', views.index)
]
pybo/views.py 작성하기
- pybo 밑의 views파일에 접근하여 index함수를 참조하는 코드이다.
- return문에 사용된 HttpResponse는 페이지 요청에 대한 응답을 할 때 사용하는 장고 클래스이다.
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
# 해당 문자열을 Http방식으로 반환해주는 메소드
return HttpResponse("<h1>안녕하세요. Pybo 메인 페이지 입니다.</h1>")
- 만약 서버 실행 후 접근이 안된다면 main위치를 mysite로 변경해 주는 과정이 필요하다.
- settings - project - project structure에 들어가서
- mysite를 누른 후 source 클릭
우리가 지금 만든 것은 게시판 pybo(python board)를 만든 것이다.( localhost:8000/pybo)로 접근가능. 원하는 기능을 추가할 때 예를 들어 쇼핑몰을 추가할 때 pybo를 만들듯이 새로 startapp 명령어로 앱을 만들어 localhost:8000/shop에 접근하도록 한다.
장고 개발 흐름 정리
- http://127.0.0.1:8000/pybo/ 요청
- config/urls.py를 먼저 확인
- path(’pybo/’, views.index)
- pybo라는 주소는 pybo 디렉토리의 views 파일을 참조하네? 그리고 뒤를 보니 index 함수를 찾아가네
- index 함수에서 처리 → 결과가 응답(반환) - HttpResponse
URL 분리하기
- config/urls.py는 urls들을 관리하는 설정창으로 모든 url을 관리할 수 있다.
- 하지만 모든 url을 한 설정창으로 컨트롤 하기에는 복잡할 수 있기 때문에 pybo, admin 등 우리가 만들고자 하는 사이트 대표 url들을 config/urls.py에서 관리한 후 그 외에 세부 항목들은 각자 앱에서 하위 url을 관리하는 등의 방식을 사용한다.
config/urls.py 수정
from django.contrib import admin
from django.urls import path ,include
from pybo import views
urlpatterns = [
path('admin/', admin.site.urls),
path('pybo/', include('pybo.urls')),
#pybo로 시작하는 url들은 모두
]
pybo 앱 수정
- pybo 앱에는 urls 파일이 존재하지 않기 때문에 파일 생성 과정이 필요하다.
urls.py 생성 후 수정
from django.urls import path
from . import views
urlpatterns = [
path('', views.index), # localhost:8000/pybo 주소의 루트를 의미함
path("test/",views.test) # 연습용으로 만든 test 주소를 의미함
]
pybo/view.py 에 test 추가
def test(request):
return HttpResponse("<div style='border: 2px solid red'>Pybo의 Test 페이지 입니다.</div>")### 실행결과
실행결과
실행과정
- cofig/urls.py 먼저 참조
- config/urls.py 에서 정의된 path() 함수에 해당하는 디렉터리로 이동
- pybo/urls.py 참조
- urls.py에 정의된 path() 함수에 해당하는 views 파일의 함수들을 참조
데이터베이스 연동
- 기본적으로는 sqlite3 파일 데이터베이스가 기본으로 설정되어 있는데 그냥 사용해도 괜찮긴 합니다.
- 저는 mysql이 깔려있기 떄문에 mysql로 진행하였고 이를 위해 settings.py를 아래와 같이 수정했습니다.
- 서버를 실행시켜 보면 did you install mysqlclient?라는 에러가 발생한다.
- pip install mysqlclient로 mysqlclient 설치
- NAME에 들어가는 pybo는 데이터베이스 이름을 이야기하는 것으로 pybo 데이터베이스가 없다면 에러가 발생하기 때문에 접속하여 database 생성하는 과정이 필요하다.
migrate와 테이블 알아보기
- 서버를 실행시켜 보면 아직 설치되지 않은 migrations들이 있다는 에러가 발생한다.
- pybo 데이터베이스에 장고에서 필요로 하는 테이블이 존재하지 않기 때문에 발생하는 문제로 관련 테이블을 만들어 주는 과정이 필요하다.
- 터미널에 아래 명령어를 실행해 주면 pybo 데이터베이스에 여러 테이블들이 추가됨을 볼 수 있다.
python [manage.py](http://manage.py) migrate
ORM
- pybo 디렉토리의 models.py에서 작성 가능
- ORM이란 sql 언어를 직접적으로 사용하지 않고 자바 파이썬 등등의 언어를 통해서 내부적으로 알아서 sql 데이터로 변환하여 데이터를 조회하는 방식
- 자바는 JPA 라이브러리 파이썬은 models 라이브러리 사용
Python의 models
- 스프링의 @Entity를 사용하여 회원가입 Class 생성했던 것과 유사함
- @Entity = DB에 저장되는 객체로 인식하는 어노테이션
설계 과정
- 우리는 게시판을 만드는 실습을 하고 있기 때문에 질문하기, 답변하기 클래스를 만든다
- 질문하기 → 제목 , 내용, 첨부하기, 작성시간, 글쓴이 등등
- 답변하기 → 내용, 작성시간, 글쓴이 등등
- 작성 시에 1(질문하기) : N(답변하기) 구성이다
- 1:N 구성은 DB에서 외래키로 연결한다. N (답변하기 부분)에서 1(질문하기)에 대한 외래키를 가져야 한다.
models.py 수정
from django.db import models
# Create your models here.
class Question(models.Model):
subject = models.CharField(max_length=200) #문자열 길이를 제한할 때 사용
content = models.TextField() # 문자열 제한이 없는 데이터 타입
create_date = models.DateTimeField() # 날짜와 시간
class Answer(models.Model):
question = models.ForeignKey(Question,on_delete=models.CASCADE)
content = models.TextField()
create_date = models.DateTimeField()
- 우리가 만든ORM 클래스들을 DB에서 읽을 수 있도록 만들어주는 과정이 필요함
- config/setting/py로 이동하여 pybo/apps.py 파일을 읽을 수 있도록 설정
- 마찬가지로 DB에 업데이트가 필요하기 때문에 migrate 과정이 필요하다.
- 터미널에 아래 명령어 실행
python manage.py makemigrations # 새로 추가한 클래스 추가하는 과정
python manage.py migrate
- 결과적으로 DB에 pybo_anser, pybo_question 테이블이 생성되는 것을 볼 수 있다.
우리는 models에서 id값을 만들지 않았지만 생긴 이유
- apps.py를 확인해 보면 default_ato_field로 기본키 값이 지정되어 있음을 알 수 있다.
장고 쉘
- 장고 웹프레임워크를 사용할 때 테스트가 가능한 쉘에 접근이 가능하다.
- 메모장에 쓰고 복사 붙여 넣기가 가능하다.
python manage.py shell
실행화면
Question 삽입
# manage.py shell의 라이브러리 선언부
from pybo.models import Question, Answer
from django.utils import timezone
# 데이터 삽입부
q = Question(subject="장고는 쓸만한가요?", content = "Python에서는 웹 프레임워크로 장고랑 Flask가 가장 유명합니다.",create_date = timezone.now())
q.save()
q = Question(subject="장고는 어떤가요??", content = "잘 모르겠어요 아직 배우는 중이라.",create_date = timezone.now())
q.save()
q = Question(subject="장고는 쓰레기인가요?", content = "아뇨;; 해외에서는 API 서버로도 많이 사용하고 있어요;;", create_date = timezone.now())
q.save()
q = Question(subject="장고 너무 잼있어요!", content = "장고는 너무 재밌는것 같아요 ㅎㅎ", create_date = timezone.now())
q.save()
q = Question(subject="장고 싫어요ㅠ", content = "파이썬이라 직관적이긴한데... 어렵네요", create_date = timezone.now())
q.save()
- 복사 붙여넣기로 위 코드를 쉘에 입력해 주면 db에 데이터가 저장됨을 볼 수 있다.
Question 조회
Question.objects.all() #: 모든 행 조회
Question.objects.get(id=1) #: id가1인 question 조회
Quesiton.objects.filter(subject__contains=”장고”) #: 장고라는 단어가 들어가 있는 question 조회
q.id # id 조회
Question 수정
q = Question.objects.get(id=1) # 가져온다
q.subject = “장고는 쓸만하지 않다”
q.save()
#과정을 통해 수정도 가능.
Question 삭제
q = Question.objects.get(id=1) # 가져온다
q.delete()
#과정을 통해 수정도 가능.
Answer 추가하기
q = Qustion.objects.get(id=2) # 데이터를 가져온다
a = Answer(question = q, content = "아뇨 아닌데요?", create_date = timezone.now())
a.save()
a = Answer(question = q, content = "잘 모르겠네요", create_date = timezone.now())
a.save()
Answer 조회
a = Answer.objects.filter(question_id=2) # question_id가 2인 answer 가져오기
a = Answer.objects.all() # answer 전부 가져오기
q.answer_set.all() # q를 기준으로 answer들 전부 가져오기
Answer 삭제
a = Answer.objects.filter(id = 1)
a.delete()
'Back > Django' 카테고리의 다른 글
4. 게시판 페이징 기능 추가하기 (0) | 2023.04.19 |
---|---|
3.5 Django 흐름 정리 (0) | 2023.04.19 |
3. 장고 부트스트랩으로 화면 꾸미기 (0) | 2023.04.19 |
2. 장고의 기본 요소 Admin, 렌더링, 동적URL매핑,DB연동 (0) | 2023.04.13 |
0. 장고 개발 준비 (0) | 2023.04.12 |