"2. View에서 form 다루기"의 두 판 사이의 차이

 
(사용자 2명의 중간 판 4개는 보이지 않습니다)
9번째 줄: 9번째 줄:
 
def 함수명(request):
 
def 함수명(request):
 
     if request.method=='GET':  # 해당 요청이 없는데 다음 과정을 진행하면 서버에러가 난다.
 
     if request.method=='GET':  # 해당 요청이 없는데 다음 과정을 진행하면 서버에러가 난다.
         담을변수 = request.GET.get('input의 이름속성')  #이름속성에 넣었던 데이터가 변수에 담긴다.
+
         담을변수 = request.GET.get('input의 이름속성')  # 탬플릿의 이름속성에 넣었던 데이터가 변수에 담긴다.
         담을변수2 = request.GET.get('input의 이름속성2')  #이름속성2에 넣었던 데이터가 변수에 담긴다.
+
         담을변수2 = request.GET.get('input의 이름속성2')  # 이름속성2에 넣었던 데이터가 변수에 담긴다.
 
</syntaxhighlight>post라면...
 
</syntaxhighlight>post라면...
  
 
request.POST['name속성'] 혹은 request.POST.get('name속성') 형태로 전달받은 변수의 값들을 확인할 수 있다.(항상 문자열)
 
request.POST['name속성'] 혹은 request.POST.get('name속성') 형태로 전달받은 변수의 값들을 확인할 수 있다.(항상 문자열)
 +
 +
여러 데이터를 받아와야 할 땐 request.POST.getlist('name속성')으로 같은 name을 가진 값들을 리스트로 받을 수 있다.
  
 
사전처럼 그 키로 값을 받아온다. '변수'가 없으면 KeyError를 발생시키고, 조건에 맞는 객체가 없으면 <code>객체.DoesNotExist</code> 에러가 발생한다.
 
사전처럼 그 키로 값을 받아온다. '변수'가 없으면 KeyError를 발생시키고, 조건에 맞는 객체가 없으면 <code>객체.DoesNotExist</code> 에러가 발생한다.
21번째 줄: 23번째 줄:
  
 
일반적으로 post입력을 받은 후엔 redirect로 돌려준다.(그렇지 않고 계속 render를 사용하면 post요청이 반복되어 새로고침하면 같은 글이 연속적으로 올라오는 문제가 생긴다.)
 
일반적으로 post입력을 받은 후엔 redirect로 돌려준다.(그렇지 않고 계속 render를 사용하면 post요청이 반복되어 새로고침하면 같은 글이 연속적으로 올라오는 문제가 생긴다.)
 +
 +
폼 체크를 통과한 입력값은 form.cleaned_data로 접근할 수 있다. 사전형태로.
 +
 +
form.cleaned_data['이름'] 형태로.
 +
 
==저장하기==
 
==저장하기==
 
DB에 저장하기 위해선 모델을 불러와 담아야 한다.<syntaxhighlight lang="python">
 
DB에 저장하기 위해선 모델을 불러와 담아야 한다.<syntaxhighlight lang="python">
52번째 줄: 59번째 줄:
 
===무언가 누락했을 때 발생시키기===
 
===무언가 누락했을 때 발생시키기===
 
모델, 폼에서의 제약을 걸어주면 누락될 때 자연스레 발생시켜준다.
 
모델, 폼에서의 제약을 걸어주면 누락될 때 자연스레 발생시켜준다.
 +
 +
=== 필드에 에러 추가하기 ===
 +
뷰를 통해 임의로 필드에러를 추가할 경우.<syntaxhighlight lang="python">
 +
form.add_error('필드','추가할 에러')
 +
</syntaxhighlight>
 +
= 모델폼이 아닌, 그냥 폼에서 모델 다루기..(아직 검증 안됨. 프로필 구현하다가 멈춰서...) =
 +
아래 코드로... profile을 만들고, user에 대한 것을 수정, 저장할 수 있을까???? 해봐야 함...
 +
 +
모델폼이 아닌, 그냥 폼으로 여러 처리를 하고 싶을 때.<syntaxhighlight lang="python">
 +
    '''계정 속성을 검증해서 이 사이트에서 회원가입한 계정의 경우에만 접속할 수 있게 하자. 앗, 그러면...sns계정 로그인 시엔 어찌하지;'''
 +
    if request.method == "POST":
 +
        from .models import Profile
 +
        form = Profile_create_form(request.POST)
 +
        if form.is_valid():
 +
            username = form.cleaned_data.get('identifier')      # 유저아이디를 입력받는다.
 +
            raw_password = form.cleaned_data.get('password')    # 패스워드를 입력받는다.
 +
            user = authenticate(username=username, password=raw_password)  # 인증 진행
 +
            if user:  # 유저모델이 반환된다면.. 프로필 모델에 저장한다.
 +
                profile = Profile()
 +
                profile.username = form.cleaned_data.get('username')
 +
                profile.nickname = form.cleaned_data.get('nickname')
 +
                profile.email = form.cleaned_data.get('email')
 +
                profile = profile.save()
 +
                request.user.profile = profile  # 해당 로그인한 유저의 프로필을 이 프로필로 채운다.
 +
                request.user.save()
 +
                return redirect('account:profile')
 +
            else:
 +
                form.add_error('identifier','비밀번호 혹은 아이디가 다릅니다.')
 +
    else:
 +
        form = Profile_create_form()
 +
    context = {'form': form,
 +
              }
 +
    return render(request, 'account/profile_create.html', context)
 +
</syntaxhighlight>

2022년 9월 25일 (일) 09:35 기준 최신판


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속성') 형태로 전달받은 변수의 값들을 확인할 수 있다.(항상 문자열)

여러 데이터를 받아와야 할 땐 request.POST.getlist('name속성')으로 같은 name을 가진 값들을 리스트로 받을 수 있다.

사전처럼 그 키로 값을 받아온다. '변수'가 없으면 KeyError를 발생시키고, 조건에 맞는 객체가 없으면 객체.DoesNotExist 에러가 발생한다.

사전으로 받는다. 그 규약을 그대로 따라서 request.POST['name속성'] 형태는 없으면 에러를 반환, request.POST.get('name속성') 형태는 None을 반환한다.


일반적으로 post입력을 받은 후엔 redirect로 돌려준다.(그렇지 않고 계속 render를 사용하면 post요청이 반복되어 새로고침하면 같은 글이 연속적으로 올라오는 문제가 생긴다.)

폼 체크를 통과한 입력값은 form.cleaned_data로 접근할 수 있다. 사전형태로.

form.cleaned_data['이름'] 형태로.

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 무언가 누락했을 때 발생시키기편집

모델, 폼에서의 제약을 걸어주면 누락될 때 자연스레 발생시켜준다.

3.3 필드에 에러 추가하기편집

뷰를 통해 임의로 필드에러를 추가할 경우.

form.add_error('필드','추가할 에러')

4 모델폼이 아닌, 그냥 폼에서 모델 다루기..(아직 검증 안됨. 프로필 구현하다가 멈춰서...)편집

아래 코드로... profile을 만들고, user에 대한 것을 수정, 저장할 수 있을까???? 해봐야 함...

모델폼이 아닌, 그냥 폼으로 여러 처리를 하고 싶을 때.

    '''계정 속성을 검증해서 이 사이트에서 회원가입한 계정의 경우에만 접속할 수 있게 하자. 앗, 그러면...sns계정 로그인 시엔 어찌하지;'''
    if request.method == "POST":
        from .models import Profile
        form = Profile_create_form(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('identifier')      # 유저아이디를 입력받는다.
            raw_password = form.cleaned_data.get('password')    # 패스워드를 입력받는다.
            user = authenticate(username=username, password=raw_password)  # 인증 진행
            if user:  # 유저모델이 반환된다면.. 프로필 모델에 저장한다.
                profile = Profile()
                profile.username = form.cleaned_data.get('username')
                profile.nickname = form.cleaned_data.get('nickname')
                profile.email = form.cleaned_data.get('email')
                profile = profile.save()
                request.user.profile = profile  # 해당 로그인한 유저의 프로필을 이 프로필로 채운다.
                request.user.save()
                return redirect('account:profile')
            else:
                form.add_error('identifier','비밀번호 혹은 아이디가 다릅니다.')
    else:
        form = Profile_create_form()
    context = {'form': form,
               }
    return render(request, 'account/profile_create.html', context)