"2. View에서 form 다루기"의 두 판 사이의 차이
둘러보기로 가기
검색하러 가기
(새 문서: 분류:3-1. 장고 폼) |
|||
1번째 줄: | 1번째 줄: | ||
[[분류:3-1. 장고 폼]] | [[분류:3-1. 장고 폼]] | ||
+ | |||
+ | ==View로 보내기== | ||
+ | 탬플릿에서 action 속성의 주소로 GET을 보내고, urls.py에서 view를 호출한다. | ||
+ | ===view에서 받기=== | ||
+ | <syntaxhighlight lang="python"> | ||
+ | import requests#호출과 json을 다루기 위한 모듈. | ||
+ | |||
+ | def 함수명(request): | ||
+ | if request.method=='GET': # 해당 요청이 없는데 다음 과정을 진행하면 서버에러가 난다. | ||
+ | 담을변수 = request.GET.get('input의 이름속성') #이름속성에 넣었던 데이터가 변수에 담긴다. | ||
+ | 담을변수2 = request.GET.get('input의 이름속성2') #이름속성2에 넣었던 데이터가 변수에 담긴다. | ||
+ | </syntaxhighlight>post라면... | ||
+ | |||
+ | request.POST['name속성'] 혹은 request.POST.get('name속성') 형태로 전달받은 변수의 값들을 확인할 수 있다.(항상 문자열) | ||
+ | |||
+ | 사전처럼 그 키로 값을 받아온다. '변수'가 없으면 KeyError를 발생시키고, 조건에 맞는 객체가 없으면 <code>객체.DoesNotExist</code> 에러가 발생한다. | ||
+ | |||
+ | 사전으로 받는다. 그 규약을 그대로 따라서 <code>request.POST['name속성']</code> 형태는 없으면 에러를 반환, <code>request.POST.get('name속성')</code> 형태는 None을 반환한다. | ||
+ | |||
+ | |||
+ | 일반적으로 post입력을 받은 후엔 redirect로 돌려준다.(그렇지 않고 계속 render를 사용하면 post요청이 반복되어 새로고침하면 같은 글이 연속적으로 올라오는 문제가 생긴다.) | ||
+ | ==저장하기== | ||
+ | DB에 저장하기 위해선 모델을 불러와 담아야 한다.<syntaxhighlight lang="python"> | ||
+ | from 모델파일 import 모델 | ||
+ | |||
+ | 객체명 = 모델명() # 새로운 객체를 만든다. | ||
+ | 객체명.속성 = 담을내용 # 해당 객체의 속성부분에 내용을 담는다. | ||
+ | 객체명.save() # 저장한다. | ||
+ | </syntaxhighlight> | ||
+ | ===모델 불러오기=== | ||
+ | [모델 불러오는 방법에 대한 내용이 없네. 나중에 게시판 수정 보면서 방법 정리하자.] | ||
+ | ===기존 모델을 불러온 경우=== | ||
+ | 데이터를 변경한 후에 반드시 .save()를 해주어야 한다. | ||
+ | |||
+ | |||
+ | |||
+ | ==폼 에러== | ||
+ | ===중복되는 경우 에러 발생시키기=== | ||
+ | 다음과 같이 폼 안에 메서드를 정의한다.<syntaxhighlight lang="python"> | ||
+ | class 폼이름(ModelForm): | ||
+ | class Meta: | ||
+ | model = 사용할 모델 | ||
+ | fields = ['필드1', '필드2',...] # 폼으로 입력할 필드를 입력해준다. | ||
+ | |||
+ | def clean_name(self): | ||
+ | name = self.cleaned_data.get('name') # 폼에서 받은 name속성을 받는다. | ||
+ | if 모델.objects.filter(name=name).exists(): # 만약 동일한 이름이 있다면.. | ||
+ | raise forms.ValidationsError('이미 있는 이름입니다~') | ||
+ | return name # 이상이 없다면 이름 반환. | ||
+ | </syntaxhighlight>이후 뷰에서 불러와 사용한다. | ||
+ | ===무언가 누락했을 때 발생시키기=== | ||
+ | 모델, 폼에서의 제약을 걸어주면 누락될 때 자연스레 발생시켜준다. |
2021년 6월 21일 (월) 11:18 판
1 View로 보내기
탬플릿에서 action 속성의 주소로 GET을 보내고, urls.py에서 view를 호출한다.
1.1 view에서 받기
import requests#호출과 json을 다루기 위한 모듈.
def 함수명(request):
if request.method=='GET': # 해당 요청이 없는데 다음 과정을 진행하면 서버에러가 난다.
담을변수 = request.GET.get('input의 이름속성') #이름속성에 넣었던 데이터가 변수에 담긴다.
담을변수2 = request.GET.get('input의 이름속성2') #이름속성2에 넣었던 데이터가 변수에 담긴다.
post라면...
request.POST['name속성'] 혹은 request.POST.get('name속성') 형태로 전달받은 변수의 값들을 확인할 수 있다.(항상 문자열)
사전처럼 그 키로 값을 받아온다. '변수'가 없으면 KeyError를 발생시키고, 조건에 맞는 객체가 없으면 객체.DoesNotExist
에러가 발생한다.
사전으로 받는다. 그 규약을 그대로 따라서 request.POST['name속성']
형태는 없으면 에러를 반환, request.POST.get('name속성')
형태는 None을 반환한다.
일반적으로 post입력을 받은 후엔 redirect로 돌려준다.(그렇지 않고 계속 render를 사용하면 post요청이 반복되어 새로고침하면 같은 글이 연속적으로 올라오는 문제가 생긴다.)
2 저장하기
DB에 저장하기 위해선 모델을 불러와 담아야 한다.
from 모델파일 import 모델
객체명 = 모델명() # 새로운 객체를 만든다.
객체명.속성 = 담을내용 # 해당 객체의 속성부분에 내용을 담는다.
객체명.save() # 저장한다.
2.1 모델 불러오기
[모델 불러오는 방법에 대한 내용이 없네. 나중에 게시판 수정 보면서 방법 정리하자.]
2.2 기존 모델을 불러온 경우
데이터를 변경한 후에 반드시 .save()를 해주어야 한다.
3 폼 에러
3.1 중복되는 경우 에러 발생시키기
다음과 같이 폼 안에 메서드를 정의한다.
class 폼이름(ModelForm):
class Meta:
model = 사용할 모델
fields = ['필드1', '필드2',...] # 폼으로 입력할 필드를 입력해준다.
def clean_name(self):
name = self.cleaned_data.get('name') # 폼에서 받은 name속성을 받는다.
if 모델.objects.filter(name=name).exists(): # 만약 동일한 이름이 있다면..
raise forms.ValidationsError('이미 있는 이름입니다~')
return name # 이상이 없다면 이름 반환.
이후 뷰에서 불러와 사용한다.
3.2 무언가 누락했을 때 발생시키기
모델, 폼에서의 제약을 걸어주면 누락될 때 자연스레 발생시켜준다.