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

 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
14번째 줄: 14번째 줄:
  
 
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> 에러가 발생한다.
57번째 줄: 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)