관리 메뉴

한다 공부

[Django] Nested Form (실패) 본문

Dev/Python

[Django] Nested Form (실패)

사과당근 2022. 8. 28. 20:17

HTML을 사용한 프론트로부터 데이터를 전달받기 위해 Form을 사용했다.

에전에 백엔드 API 서버를 만들었을 때는 Serializer를 사용했는데 Form과 Serializer는 형태가 유사하다.

 

Form, ModelForm은 HTML 입력폼을 통해 입력에 대한 유효성 검사를 수행하고

주로 Create, Update 등 admin에서 활동이 된다.

 

Serializer, ModelSerializer는 데이터 변환과 직렬화를 지원하는 것이다.
주로 JSON 포맷 입력에 대한 유효성을 검사한다.


프로젝트를 진행하던 중,

내가 원하는 형태는 "날짜, 위치, 능력" 을 하나의 폼에서 데이터를 받아오는 것이었다.

하지만 Nested serializer, 즉 중첩된 시리얼라이저는 지원을 해주지만 Nested form은 지원해주지 않는다는 것을 알게되었다. (1차 고비)

우회하여 사용할 수는 있다고 하는데.. 더 나은 방법이 없을까 고민을 한 결과..

 

그냥 날짜 / 위치 / 능력에 대해 각각의 Form을 구현하고자 했다.

그런데 내가 구현한 Model은, 날짜 모델 안에 요일 모델과 시간 모델이 있었다.

위치 모델 안에도 도/특별시/광역시를 나타내는 큰 범주의 모델이 시/군/구, 상세 주소를 나타내는 작은 범주의 모델이 있었다...

즉 모델끼리 연관관계를 가진게 많았다는 것이다!

 

그렇다고 날짜 모델 안에서 요일 모델과 시간 모델에 대한 데이터를 받는 form을 각각 만들 수도 없는 노릇.

그래서 모델과 연관된 Model Form이 아닌 일반 Form을 사용하기로 했다.

 

나는 Form으로 데이터를 받아와 하나하나 저장하는 방식을 선택했다.

하지만 이 방식이 가장 효과적인 방법이었을까? 의구심이 든다.

def userDay(request):
    if request.method == 'POST':
        form = UserDayForm(request.POST)
        if form.is_valid():
            day_week = request.POST['day_week']
            start_time = request.POST['start_time']
            end_time = request.POST['end_time']
            user = request.user

            Day.objects.filter(user=user, day_week=day_week).delete()
            user_day = Day.objects.create(user=user, day_week=day_week)
            user_time = Time.objects.get_or_create(day=user_day, start_time=start_time, end_time=end_time)
            return redirect('donadona:info')
    else:
        form = UserDayForm()
    context = {'form': form}
    return render(request, 'donadona/user_day_form.html', context)

위와 같이, request.POST를 사용하여 데이터를 하나씩 저장한다. ModelForm을 이용하면 단 한 줄로 데이터를 저장할 수 있었을텐데 ㅜ


그렇다면 Model Form이 아닌 Form을 쓰기 때문에, 모델에 제한을 안 받으니까 "날짜, 위치, 능력" 을, 처음 기획한대로 하나의 폼에서 받을 수 있지 않을까?! 하는 생각이 들었다.

그러나 날짜를 선택할 때, 월/화/수/목/금 등 여러 요일에 대해 각각 시간대를 선택해서 받아야하는데, Form 하나에 불특정횟수의 여러 데이터를 반복해서 받을 수 있는가..? 에 대한 어려움을 겪었다. (월 2시~4시 / 화 1시~4시 / 수 .. 등등 여러 날짜에 대한 데이터를 하나의 폼에..?)

 

현재로서는 하나의 폼에 하나의 데이터만 받기로 했다.

대신, 사용자 편의를 위해 아래와 같이 날짜를 선택하는 페이지에서, 이전에 내가 선택했던 날짜가 무엇인지 띄워야겠다는 생각이 들었다.

 

요일과 시간을 선택하는 페이지의 상단에,

사용자가 기존에 어떤 요일, 어떤 시간대를 선택했었는지 보여주면 (보여주기 + 삭제 가능하게)

요일 선택에 더욱 편리성을 부여할 수 있을 것이라고 생각한다..