Python과 Django의 CRUD 작업 - 2부

王林
풀어 주다: 2024-07-25 15:17:12
원래의
815명이 탐색했습니다.

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

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

양식

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

으아악

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

으아악

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

Add Exercise

HTML에서는

메소드 속성이 POST로 설정되고 작업 속성이 /를 가리키는 태그가 있는데, 이는 연습 목록을 가져오는 데 사용하는 것과 동일한 엔드포인트입니다.

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

우리 양식에는 운동 모델의 스키마에 따라 제목과 날짜에 대한 두 개의 입력 필드가 있습니다. 양식이 제출되면 제목 및 날짜 값이 POST 요청을 통해 / 엔드포인트로 전송된 후 app/views.py의 색인 보기에서 처리됩니다.

모델

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

으아악

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

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

으아악

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

운동 업데이트

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

으아악

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

으아악

저희는 <양식> 목록의 각 운동에 대해 다시 태그를 지정하고 운동을 업데이트하는 데 사용되는 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})
로그인 후 복사

We check for the button name and forward the request to the appropriate Exercise method accordingly.

Let's add an update class method to the Exercise model in 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
로그인 후 복사

To update a row in the database, we can use the update method available on the Exercise model. However, before updating, we need to ensure that we are updating the correct exercise. To do this, we filter the exercises by the primary key, which is id, and update only that specific exercise.

Delete Exercise

Similarly, we’ll add a delete button next to each exercise in the exercise.html template.

 ...   
로그인 후 복사

We’ll set delete as the value of the name attribute, and in views.py, we’ll extend the if...elif statements to handle the delete operation.

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})
로그인 후 복사

And in the Exercise model, we'll add the class method 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
로그인 후 복사

With this addition, we've successfully implemented CRUD operations in our Python and Django application.

Key Takeaways

  1. Django view handlers do not support PUT and DELETE requests, as they do not parse the query parameters or request body for those HTTP methods. As a result, we must rely on POST requests and differentiate between them by passing an additional field in the request body.
  2. Noticed that I'm making the POST request to the same route from which I'm fetching the exercises. This is important because if you were to create an endpoint like /api/exercises to handle requests, you would need to manage redirection manually. Otherwise, the behavior of thetag after the request is to redirect the user to the endpoint specified in the action attribute. Therefore, you will need to manually redirect the user back to the desired page, or in our case, keep the user on the same page.
from django.http import HttpResponseRedirect def index(request): ... return redirect('/') # or return HttpResponseRedirect(request.META['HTTP_REFERER'])
로그인 후 복사

In summary, by effectively managing our POST requests and ensuring proper redirection, we can create a seamless user experience while implementing CRUD operations in our Django application.

위 내용은 Python과 Django의 CRUD 작업 - 2부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!