티스토리 뷰

참고한 곳

Django Forms API

Django Forms and field vaildation

 

대부분 views.py에서 form.is_valid()를 사용할 것이다.

def function(request):  
    if request.method == "POST":
        form = SomeForm(request.POST)
        if form.is_valid():
            SomeModel = form.save(commit=False)
            ...
            SomeModel.save()
            messages.success(request, '성공적으로 등록되었습니다.')
            return redirect('SomeApp:SomeView', SomeModel.id)
        else:
            messages.error(request, 'Error!')
            return redirect('SomeApp:SomeView')
    else:
        form = SomeForm()
        return render(request, 'SomeURL.html', {'form': form})

내가 하고 싶은 것은, if form.is_vaild()가 False일 때 진행되는 else 부분에서 어떤 에러 메시지를 어떻게 출력하는지이다.

(티스토리 에디터가 바뀌어서 코드의 글씨 색깔을 바꿀 수 없어서 불편...)

 

forms.py를 보자.

from django import forms
import datetime

class RecruitForm(forms.ModelForm):
    class Meta:
        model = SomeModel
        fields = (...SomeFields...)
        widgets = {
            ...
        }
        help_text = {
            ...
        }

    def clean(self):
        now = datetime.datetime.now()
        form_data = self.cleaned_data
        try:
            datetime = datetime.datetime.combine(form_data['date'], form_data['time'])
            # 날짜 입력과 시간 입력을 합쳐서 datetime으로 만듬
        except:
            raise forms.ValidationError('시간이 제대로 입력되지 않았습니다. 입력되지 않는다면 크롬이나 모바일로 접속해주세요.')
        # 날짜가 과거라면 에러
        if datetime <= now:
            raise forms.ValidationError('과거의 시간은 입력할 수 없습니다.')
        return form_data

내 코드의 경우, date와 time을 가지고 valid를 확인하는 코드이다.

2가지를 valid한지 보는데, 하나는 date와 time이 둘 다 입력되어 있는가, 다른 것은 입력한 시간이 미래인가이다.

두 가지 경우에 따라 다른 에러 메시지를 보내고 싶다.

 

raise forms.ValidationError라는 코드를 사용하고 뒤에 출력하고 싶은 에러 메시지를 넣는다.

Django Document를 보면 에러 메시지만 쓰지 말고 타입이나 그런 걸 같이 쓰라는데, 나는 메시지만 보여주고 싶기 때문에 이렇게 썼다.

이렇게 간단하게 써도 에러는 안 난다.

 

만약 잘못된 값이 입력되어서 views.py로 invalid 하다고 정보를 보내면 views.py에서는 그 정보를 어떻게 처리할까?

Form API로 간단하게 사용할 수 있다.

form = SomeForm(request.POST)
form.errors			# print(form.errors)를 하면 html로 표시된다.
form.non_field_errors()		# message만 보여준다.

messages.error(request, form.non_field_errors())

views.py에서 form을 불러오면 form.errors를 사용할 수 있다.

django의 message를 이용한다면 form.non_field_errors()라는 함수로 forms에서 넘겨준 에러를 정확히 출력할 수 있다.

만약 non_field_erros() 대신에 errors를 넣으면 list 형태로 출력되는데, __all__이라는 쓸데없는 표시도 뜬다.

이걸 이렇게 저렇게 어찌어찌 쓰면 더 유용할 수 있지만 나는 간단하게 쓸 것이기 때문에 그렇게 사용하지 않았다.

 

django message를 이용하는 방법은 여기.

 

끝.

'gistalk 개발' 카테고리의 다른 글

Django tas app 11 : 통계페이지  (0) 2020.04.13
python 3.8 & Django 3.0 설치  (0) 2020.03.13
Django tas app 추가 6 : template tags & filters  (0) 2018.07.02
crawling하기  (0) 2018.03.19
[그냥 메모]카카오톡 api 사용  (0) 2018.03.01
댓글