Share
Sign In
TIL 웹개발
TIL 웹개발 - Django form 정리
서경태
👍
우선 form은 클라이언트가 데이터를 조회하거나 전송할 때 사용하는 태그(tag)다.
게시글을 작성하는 form을 작성하면 아래 코드와 같다.
# html에서 사용할 때 <form action="" method=""> <label for="title">제목</label> <input type="text" id="title" name="title"> <label for="content">내용</label> <textarea id="content" name="content" cols=10 rows=10> </form>
제목과 내용을 작성해 form형태로 서버에 전달해 처리한다.
이 form 형태를 쉽게 처리하는 기능을 django에서 제공하는데 D
jango model form이다.
데이터베이스 모델에 대응하는 폼을 자동으로 생성해주는 기능으로 위 코드처럼 별도로 폼을 정의하지 않아도 된다.
그리고 데이터베이스 기준에 따라 (텍스트, 숫자 등) 형식을 맞추지 않을 경우 자동으로 경고 메시지를 보내주기도 한다.
Django model form
1.
모델과 폼의 자동 연결
ModelForm을 사용하면, Django 모델에 정의된 필드를 기반으로 자동으로 폼 필드가 생성된다.
예를 들어, 모델에서 Charfield, DateField 등이 있다면, 해당 필드에 맞는 html 폼 필드가 생성된다.
2.
간편한 데이터 처리
모델 폼은 데이터의 유효성을 검사하고, 유효하다면 데이터베이스에 쉽게 저장할 수 있다.
form.save() 메소드를 사용하면 폼데이터를 모델 인스턴스로 변환하고 저장할 수 있다.
3.
유효성 검사
모델 폼은 모델에서 정의된 필드의 유효성 검사(예: 최대 길이, 필수 입력 여부)를 자동으로 처리한다.
추가적인 커스텀 유효성 검살르 쉽게 정의할 수 있다.
모델 폼 정의하는 방법
Article 데이터베이스 / models.py
from django.db import models class Article(models.Model): title = models.CharField(max_length=50) content = modles.TextField() def __str__(self): return self.title
현재 title과 content라는 데이터 베이스가 있는 경우,
from django import forms from .models import Article # 위 models.py에서 Article 모델을 참조하도록 설정한다. class ArticleForm(forms.ModelForm): class Meta: model = Article fields = ['title', 'content'] # 사용할 모델의 필드 지정 # 모든 필드를 사용하고 싶다면 # fields = "__all__"
이렇게 하면 모델폼을 정의하고 사용할 수 있다.
그럼 다시 html에서 아래와 같이 간단하게 사용할 수 있다.
# html에서 모델폼 사용 <form action="" method=""> {{ form.as_p }} </form>
그리고 해당 내용을 전송받는 view에서도 title과 content를 받아 새로운 article을 생성하는 번거로움 없이 아래 코드처럼 작성할 수 있다.
# view.py 에서 def create(request): form = ArticleForm(request.POST) if form.is_valid(): article = form.save() return redirect('detail', article.pk) # html form을 사용하는 경우 코드 # title = request.POST.get("title") # content = request.POST.get("content") # article = Article.objects.create(title=title, content=content) # return redirect("detail", article.pk)
이처럼 모델폼을 사용하면 유효성 검사까지 간단하게 할 수 있다.
Subscribe to 'kyugntae-ai'
Welcome to 'kyugntae-ai'!
By subscribing to my site, you'll be the first to receive notifications and emails about the latest updates, including new posts.
Join SlashPage and subscribe to 'kyugntae-ai'!
Subscribe
👍
Other posts in 'TIL 웹개발'See all
서경태
TIL 웹개발 - Django form, model 등등 찾아보기
Django를 배우다보니 어느순간 기억하는데 한계가 오기 시작한다. 그 이유는 import하는 함수, 데코레이터, 모델, 폼 등등 너무 복잡하기 때문인데... 이참에 정리해보고 여기서 한번에 확인하자.. (자동 완성은 from 머시기도 다 찾아주나...) Accounts 관련 로그인 / 로그아웃 기능 auth_login(request, user)를 사용한다. user가 없는 경우 request.user를 사용한다. 로그아웃할때 자동으로 세션를 삭제해준다. 로그인 폼 현재 프로젝트에서 사용되는 사용자 모델 가져오는 기능 커스텀 사용자 모델을 사용하는 경우, settings.py에 AUTH_USER_MODEL을 설정해야한다. AUTH_USER_MODEL를 설정하지 않으면 기본 사용자 모델을 사용한다. 회원가입 / 회원 정보 수정 폼 비밀번호 변경 폼 데코레이터
서경태
TIL 웹개발 - Django에서 커스텀 폼 사용하기
Django에서 제공되는 Form을 커스텀해서 사용하는 방법에 대해 알아보자. 회원 정보를 수정하는 페이지를 만들때, 간편하게 UserChangeForm을 사용할 수 있다. 하지만 이 폼에는 아래 이미지처럼 일반 회원이 굳이 접하지 않아도 되는 필드들이 나온다. 그래서 커스텀 폼을 사용해 필요한 내용만 나오도록 조정한다. 먼저 forms.py에서 쟝고에서 제공하는 UserChangeForm을 임포트한다. CustomUserChangeForm을 만들고 ()안에 UserChangeForm을 넣어 상속을 받는다. class Meta: model = get_user_model() 은 모델폼을 만든 것이다. fields를 리스트로 만들어 안에 필요한 내용을 채운다. 코드처럼 이름과 이메일 주소만 기입하도록 설정했다. 처음 이미지와 달리 깔끔하게 필요한 정보만 기입하도록 수정했다.
서경태
TIL 웹개발 - Django쟝고에서 Decorator 데코레이터 사용하기
Django에서 데코레이터는 웹 애플리케이션의 특정 기능을 쉽게 구현할 수 있도록 도와준다. 주로 인증, 권한 관리, 보안, 캐싱 등의 기능을 위해 사용된다. @login_required : 로그인된 사용자만 접근 가능 @permisison_required : 특정 권한이 있는 사용자만 접근 가능 @crsf_exempt : CSRF 검사를 비활성화 @require_http_mothods : 지정된 HTTP 메소드만 허용 @require_POST: POST 요청만 허용 @cache_page: 지정된 시간동안 캐싱하여 출력 성능 향상 @transaction.atomic: 하나의 트랜잭션으로 모든 DB작업 처리 위 데코레이터들은 쟝고에서 주로 사용되는 것들인데 이제 하나씩 알아보자. @login_required 사용자가 로그인하지 않은 상태에서 이 데코레이터가 사용된 뷰에 접근하면 로그인 페이지로 다이렉트를 하는 기능 제공한다. 이렇게 사용하면 my_view에 접근하기 위해 로그인이 필요하고 로그인하지 않은 경우 로그인 페이지로 이동한다. (물론 로그인 페이지가 있는 경우) 이때 두 가지 방법으로 로그인 페이지를 login_required와 연결할 수 있다. 직접 login_url 설정 @login_reqired 데코레이터 함수를 보면 다음과 같이 작성되어 있다. 여기서 login_url = None으로 되어있는데 이 부분을 로그인 페이지로 설정하면 데코레이터가 정상적으로 작동한다. accounts / login.html 설정 쟝고의 기본 설정에 따라 아래 그림처럼 페이지를 구성하면 @login_required를 사용할 수 있다. 로그인 페이지를 accounts 폴더에 위치시키면 쟝고가 알아서 해당 페이지를 리다이렉트해준다. 로그인 후에는 사용하던 페이지의 url을 next 파라미터에 저장해 다시 리다이렉트 해주니 굉장히 편리한 기능이다.