Study/Django

[Django] url.py과 view.py 조금 더 알아보기

taecongs 2023. 9. 13. 12:05

 


Django 공부하기 ✨


views.py & url.py 관계는?

(1) views.py란 무엇인가?

  • Client에서 보낸 Request에 대해서 Response을 보내주는 역할을 한다.
  • 세부적으로는 View는 Django 필요한 데이터를 모델에서 가져와서 적절히 가공하여 웹 페이지 결과를 만들도록 한다.
(1) model 작성하기
  • view.py를 작성하기 전에 model.py를 만들어 makemigration과 migrate가 먼저 선행되어야 한다.
// 점프 투 장고를 통해 진행하고 있는 예제

from django.db import models

# 질문 모델 정의
class Question(models.Model):
    # 질문 주제를 문자열로 저장, 최대 길이는 200자
    subject = models.CharField(max_length=200)
    
    # 질문 내용을 텍스트 필드로 저장.
    content = models.TextField()
    
    # 질문이 생성된 날짜와 시간을 저장.
    create_date = models.DateTimeField()  
    
    def __str__(self):
        # 객체를 문자열로 표현할 때 주제를 반환.
        return self.subject  

# 답변 모델 정의
class Answer(models.Model):
    # 답변이 어떤 질문에 대한 것인지를 외래 키로 연결, 연결된 질문이 삭제되면 답변도 함께 삭제.
    question = models.ForeignKey(Question, on_delete=models.CASCADE)  
    
    # 답변 내용을 텍스트 필드로 저장.
    content = models.TextField()
    
    # 답변이 생성된 날짜와 시간을 저장.
    create_date = models.DateTimeField()
(2) view 작성하기
  • views.py에 코드를 작성한다.
// 점프 투 장고를 통해 진행하고 있는 예제

from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Question
from .forms import QuestionForm

# 질문 목록을 보여주는 뷰 함수
def index(request):
    # 질문을 최신순으로 정렬하여 가져옴.
    question_list = Question.objects.order_by('-create_date')  
    
    # 질문 목록을 템플릿에 전달할 context 변수를 생성.
    context = {'question_list' : question_list}
    
    # question_list.html 템플릿을 렌더링하여 화면에 표시.
    return render(request, 'pybo/question_list.html', context) 

# 질문 상세 페이지를 보여주는 뷰 함수
def detail(request, question_id):
    # 주어진 질문 ID에 해당하는 질문 객체를 가져오거나 404 에러를 반환.
    question = get_object_or_404(Question, pk=question_id) 
    
    # 질문 상세 정보를 템플릿에 전달할 context 변수를 생성.
    context = {'question' : question}
    
    # question_detail.html 템플릿을 렌더링하여 화면에 표시.
    return render(request, 'pybo/question_detail.html', context)

 

(2) urls.py란 무엇인가?

  • 아래와 같이 URL 패턴 정의를 통해 Django는 클라이언트 요청을 적절한 뷰 함수로 라우팅하고, 뷰 함수에서 요청을 처리한 후 적절한 응답을 반환한다. 이렇게 URL 패턴을 설정함으로써 Django 애플리케이션은 웹 페이지 및 기능을 쉽게 확장하고 관리할 수 있게 된다.
(1) app 폴더 내 (config/urls.py)
  • 프로젝트의 전체 URL 구성을 정의하며, urlpatterns 리스트에 URL 패턴을 추가하여 뷰 함수와 매핑시킨다. 쉽게 말해, 각 패턴은 특정 URL로 들어왔을 때 실행될 뷰 함수를 지정한다.
// 점프 투 장고를 통해 진행하고 있는 예제 (config/urls.py)

from django.contrib import admin
from django.urls import path, include


urlpatterns = [
    path('admin/', admin.site.urls),
    path('pybo/', include('pybo.urls')),
]
(2) 프로젝트 폴더 내 (pybo/urls.py)
  • 'pybo' 애플리케이션의 URL 패턴을 정의한다.
  • app_name 변수를 사용하여 URL 패턴의 네임스페이스를 정의하고, urlpatterns 리스트에 URL 패턴을 추가한다.
// 점프 투 장고를 통해 진행하고 있는 예제 (pybo/urls.py)

from django.urls import path

from . import views

app_name = 'pybo'

urlpatterns = [
    path('', views.index, name='index'),   # URL 별칭 사용(name='index')
    path('<int:question_id>/', views.detail, name='detail'),  # URL 별칭 사용(name='detail')
    path('answer/create/<int:question_id>/', views.answer_create, name='answer_create'),
    path('question/create/', views.question_create, name='question_create'),
]
(3) 예시를 통해 url.py 정리하기
config/urls.py   pybo/urls.py   최종 URL
'pybo/' + '' = 'pybo/'
'pybo/' + 'question/create/' = 'pybo/question/create/'

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

[Django] 폼 (12)  (0) 2023.09.15
[Django] 스태틱 (11)  (0) 2023.09.14
[Django] settings.py  (0) 2023.09.13
[Django] 데이터 저장 (10)  (0) 2023.09.12
[Django] URL 별칭 (9)  (0) 2023.09.12