"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Python과 Django의 CRUD 작업 - 2부

Python과 Django의 CRUD 작업 - 2부

2024-07-29에 게시됨
검색:727

이전 기사에서는 Django 프로젝트 설정의 기본 사항을 다루고 운동 모델을 만들어 프런트 엔드에 목록으로 표시했습니다. 이 문서에서는 CRUD 작업 수행에 대해 살펴보겠습니다. 익숙하지 않은 분들을 위해 설명하자면 CRUD는 생성(Create), 읽기(Read), 업데이트(Update), 삭제(Delete)를 의미합니다. 기본적으로 데이터에 대해 수행할 수 있는 네 가지 기본 작업입니다.

이제 앱 폴더에 API가 설정되었으므로 색인 보기를 확장하여 생성, 업데이트, 삭제 요청을 처리하겠습니다.

양식

사용자가 운동을 만들 수 있는 양식을 설정해 보겠습니다. 우리는 이 목적을 위해 HTML 템플릿을 다시 한 번 사용할 것입니다. 시작하려면 app/templates 폴더에 add_exercise.html이라는 새 템플릿을 만드세요.

{% csrf_token %}

다음으로 index.html 템플릿에 다음 방법을 사용하여 add_exercise.html 템플릿을 포함하겠습니다.

{% extends "base.html" %} {% block content %}
    

Exercises

{% include 'add_exercise.html' %} ... {% endblock %}

여기에서는 HTML 템플릿 전체의 구성성을 촉진하여 코드를 더 쉽게 유지 관리하고 이해할 수 있도록 하는 include 태그를 활용하고 있습니다. 브라우저에서 페이지를 새로 고치면 화면에 양식이 나타나는 것을 볼 수 있습니다.

Add Exercise

HTML에서는 메소드 속성이 POST로 설정되고 작업 속성이 /를 가리키는

태그를 사용하고 있는데, 이는 연습 목록을 가져오는 데 사용하는 것과 동일한 엔드포인트입니다.

이 맥락에서 csrf_token은 무작위로 생성된 비밀 값으로 표시되는 보안 기능입니다. 이는 CSRF가 교차 사이트 요청 위조(Cross-Site Request Forgery)를 의미하는 위조 공격으로부터 양식 제출을 보호하는 데 도움이 됩니다. 각 사용자 세션마다 고유한 토큰이 생성되며, 이는 제3자 사이트에서 접근할 수 없으므로 무단 변경이 발생하는 것을 방지합니다.

우리 양식에는 두 개의 입력 필드가 있습니다. 하나는 제목용이고 다른 하나는 날짜용이며 운동 모델의 스키마를 따릅니다. 양식이 제출되면 제목 및 날짜 값이 POST 요청을 통해 / 엔드포인트로 전송되며, 그런 다음 app/views.py의 색인 보기에서 처리됩니다.

모델

Django에서는 CRUD 작업에 해당하는 특정 메서드를 추가하여 운동 모델(기본적으로 Python 클래스)을 향상할 수 있습니다. app/models.py 파일에는 다음이 포함됩니다.

class Exercise(models.Model):
    ...

    def create(request):
        title = request.POST.get('title')
        date = request.POST.get('date')

        exercise = Exercise.objects.create(title=title, date=date)

        return exercise

위 코드에 표시된 것처럼 POST 요청에서 제목과 날짜에 액세스할 수 있습니다. 그런 다음 Django에 내장된 ORM을 활용하여 새로운 연습을 만들고 생성된 인스턴스를 반환할 수 있습니다.

운동 검색에 사용하는 것과 동일한 색인 보기를 활용하여 확장하여 요청 방법이 POST인지 확인합니다. 그렇다면 이전에 정의한 클래스 메서드에 요청 개체를 전달합니다. 운동이 생성되면 사용자를 홈페이지로 다시 리디렉션하거나 페이지 새로 고침을 수행하여 새로 추가된 운동이 화면에 나타나는지 확인합니다.

from django.http import HttpResponseRedirect

from app import models

...

def index(request):
    if request.method == 'POST':
        models.Exercise.create(request)
        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

지금 새 운동을 만들어 보면 목록 하단에 나타나는 것을 볼 수 있습니다.

운동 업데이트

연습에 업데이트 기능을 추가하기 전에 코드를 약간 리팩터링해 보겠습니다. 연습문제를 exercise.html이라는 자체 템플릿으로 이동하겠습니다.

Exercises

{% include 'add_exercise.html' %}
    {% for exercise in exercises %}
  • {% include 'exercise.html' %}
  • {% endfor %}

app/templates 폴더에 exercise.html용 템플릿을 만들고 여기에 다음 HTML을 추가합니다.

{% csrf_token %}

목록의 각 운동에 대해

태그를 다시 사용하고 운동을 업데이트하는 데 사용되는 exercise.id에 대한 숨겨진 입력을 추가하고 있습니다. 브라우저로 돌아가서 페이지를 새로 고치십시오. 목록의 각 운동에 대한 양식이 표시되며 각 입력에는 해당 운동 데이터가 미리 채워져 있습니다.

CRUD Operations In Python & Django - Part 2

양식 방법으로 PUT을 사용하지 않습니다. 대신 POST를 사용하고 있습니다. 이는 뷰 핸들러가 PUT 및 DELETE에 대한 기본 지원 없이 GET 및 POST 요청을 통해 전송된 데이터만 구문 분석할 수 있기 때문입니다. Exercise 클래스에서 create 클래스 메소드를 생성했을 때 request.POST.get('title')을 사용했다는 사실을 눈치채셨을 것입니다. 이는 POST 요청에 작동하지만 요청 객체에는 PUT 또는 DELETE 메서드를 사용할 수 없습니다.

그런데 POST 요청과 PUT 요청을 어떻게 구별하나요? 앞서 만든 양식을 확인하면 제출 버튼에 이름 속성이 할당되어 있음을 알 수 있습니다. request.POST.get('update').

를 사용하여 제목과 날짜에 액세스한 것과 동일한 방식으로 이 속성에 액세스할 수 있습니다.

동일한 변경 사항을 포함하도록 연습 생성 양식을 업데이트하겠습니다.

...

그리고 연습 보기에서는 요청을 구별하기 위해 다음과 같이 변경하겠습니다.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

버튼 이름을 확인하고 그에 따라 적절한 연습 방법으로 요청을 전달합니다.

app/models.py의 운동 모델에 업데이트 클래스 메소드를 추가해 보겠습니다.

def update(request):
    id = request.POST.get('id')
    title = request.POST.get('title')
    date = request.POST.get('date')

    exercise = Exercise.objects.filter(pk=id).update(title=title, date=date)

    return exercise

데이터베이스의 행을 업데이트하려면 운동 모델에서 사용할 수 있는 업데이트 방법을 사용할 수 있습니다. 하지만 업데이트하기 전에 올바른 운동을 업데이트하고 있는지 확인해야 합니다. 이를 위해 기본 키인 ID를 기준으로 운동을 필터링하고 해당 특정 운동만 업데이트합니다.

운동 삭제

마찬가지로 exercise.html 템플릿의 각 운동 옆에 삭제 버튼을 추가하겠습니다.

...

삭제를 name 속성의 값으로 설정하고 views.py에서 삭제 작업을 처리하기 위해 if...elif 문을 확장합니다.

def index(request):
    if request.method == 'POST':
        create = 'create' in request.POST
        update = 'update' in request.POST
        delete = 'delete' in request.POST

        if create == True:
            models.Exercise.create(request)
        elif update == True:
            models.Exercise.update(request)
        elif delete == True:
            models.Exercise.delete(request)

        return redirect('/')

    exercises = (
        models.Exercise.objects.all().order_by("created_at")
    )
    return render(request, "index.html", context={'exercises': exercises})

그리고 연습 모델에 delete 클래스 메소드를 추가하겠습니다.

def delete(request):
    id = request.POST.get('id')
    is_deleted = Exercise.objects.filter(pk=id).delete()

    if is_deleted == 1:
        return True

    return False

이 추가를 통해 Python 및 Django 애플리케이션에서 CRUD 작업을 성공적으로 구현했습니다.

주요 시사점

  1. Django 뷰 핸들러는 PUT 및 DELETE 요청을 지원하지 않습니다. 해당 HTTP 메소드에 대한 쿼리 매개변수 또는 요청 본문을 구문 분석하지 않기 때문입니다. 결과적으로 우리는 POST 요청에 의존해야 하며 요청 본문에 추가 필드를 전달하여 두 요청을 구별해야 합니다.
  2. 연습을 가져오는 동일한 경로에 POST 요청을 하고 있음을 확인했습니다. 요청을 처리하기 위해 /api/exercises와 같은 엔드포인트를 생성하려는 경우 리디렉션을 수동으로 관리해야 하기 때문에 이는 중요합니다. 그렇지 않으면 요청 후
    태그의 동작은 사용자를 action 속성에 지정된 끝점으로 리디렉션하는 것입니다. 따라서 수동으로 사용자를 원하는 페이지로 다시 리디렉션해야 하며, 우리의 경우 사용자를 동일한 페이지에 유지해야 합니다.
from django.http import HttpResponseRedirect

def index(request):
    ...

    return redirect('/')
    # or
    return HttpResponseRedirect(request.META['HTTP_REFERER'])

요약하자면, POST 요청을 효과적으로 관리하고 적절한 리디렉션을 보장함으로써 Django 애플리케이션에서 CRUD 작업을 구현하는 동안 원활한 사용자 환경을 만들 수 있습니다.

릴리스 선언문 이 글은 https://dev.to/prvnbist/crud-Operations-in-python-django-part-2-4fad?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3