될때까지

Django issue : form_valid? form_invalid? 본문

학습/살이되고 뼈가되어라

Django issue : form_valid? form_invalid?

랖니 2022. 2. 24. 22:36
728x90

유튜버 Dennis Ivy의 To Do List 만드는 영상을 참고로, Django 스터디에 들어갔다.

참고영상 : https://www.youtube.com/watch?v=llbtoQTt4qw&t=1973s

 

영어 강의라서 코드만 보며 열심히 타이핑하면서 따라가고 있었는데

띠로리 영상의 결과값과 내 결과가 다르게 나타나는 것이 아닌가😭

초보자가 혼자 공부할때는 이게 제일 스트레스.. 😫

직면한 문제는 아래와 같다.

추가한 task가 task_list화면에 안나타난다..!!! 왜!!!

 

기존의 상태에서는, 내가 작성한 투두리스트가 다른 사람 아이디로 로그인해도 화면에 보여지고 있었다. 내가 작성한 투두리스트들만 보이게끔 코드를 수정하는 부분을 따라하고 있었는데 뚜둥 똑같이 따라쳤는데 새로 생성한 태스크들이 안보인다. 왜일까 뭐가 문제일까..? 

여기까지 작성했던 코드는 아래와 같았다.

from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.urls import reverse_lazy
from .models import Task

from django.contrib.auth.views import LoginView

from django.contrib.auth.mixins import LoginRequiredMixin

class CustomLoginView(LoginView):
    template_name = 'base/login.html'
    fields = '__all__'
    redirect_authenticated_user = True
    
    def get_success_url(self):
        return reverse_lazy('tasks')


class TaskList(LoginRequiredMixin, ListView):
    model = Task
    context_object_name = 'tasks'
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['tasks'] =context['tasks'].filter(user=self.request.user)
        context['count'] =context['tasks'].filter(complete=False).count()
        return context
    
class TaskDetail(LoginRequiredMixin, DetailView):
    model = Task
    context_object_name = 'task'
    template_name = 'base/task.html'
    
class TaskCreate(LoginRequiredMixin, CreateView):
    model = Task
    fields = ['title', 'description', 'complete']
    success_url = reverse_lazy('tasks')
    
    def form_invalid(self, form):
        form.instance.user = self.request.user
        return super(TaskCreate, self).form_valid(form)
    
class TaskUpdate(LoginRequiredMixin, UpdateView):
    model = Task
    fields = ['title', 'description', 'complete']
    success_url = reverse_lazy('tasks')    
    
class DeleteView(LoginRequiredMixin, DeleteView):
    model = Task
    context_object_name = 'task'
    success_url = reverse_lazy('tasks')

한참을 고생했다.

유튜브를 계속 돌려보면서 틀림그림찾기도 하고,

stackoverflow도 찾아보고

구글링도 해봤지만 안나와 ㅠㅠ

'django can't show', ''django admin show but', 'django why can't see update', ... 

 

왜 안나오는 지 모르니까 저렇게 밖에 칠 수 없었던 나의 짧은 영어😢

 

1시간 넘게 헤매다가 일단 따라해보자 진도를 나갔다. 그렇데 2시간이 흐른 뒤 찾아낸....

원인.

나와 같은 초보자들은 다들 그런 경험이 한 두 번씩 있겠지?

설마 이거 때문에...? 했는데 거의 99.9% '그거' 때문에 생긴 문제인 적😱

class TaskCreate(LoginRequiredMixin, CreateView):
    model = Task
    fields = ['title', 'description', 'complete']
    success_url = reverse_lazy('tasks')
    
    # def form_invalid(self, form):
    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(TaskCreate, self).form_valid(form)

아직 Django를 뜯어보면서 공부하지 않아서 저 코드가 무슨 뜻인지 정확히는 모르지만,

마지막 줄에 보면, return 생성한 함수(form_invalid)를 다시 호출해야하는데 호출이 못이루어져서 생긴 문제 아닐까 싶었다. 불길한 느낌이 싸악 들었고 그런 느낌은 항상 맞지 신기하다니까😱

혹시나 하고 form_invalid함수명을 form_valid로 수정했더니 제대로 나타나는 나의 투두 리스드들...

감격의 순간 ㅜㅜ 흑흑 찾아냈어 드디어!

그렇다면 만약에, return할 때 생성한 함수명 그대로, super().form_invalid로 했다면 나타날까?

나타날까 싶어서 해봤지만 안나타나는 투두리스들. 함수명 form_valid와 리턴할때도 form_valid일때만 제대로 반영이 되는 걸 확인했다

 

처음 코딩배울때 가장 많이 하는 실수는 매번 똑같은 것 같다.

똑같이 따라 쳤는데 왜 나는 안되지? 하고 찾아보면 눈이 삐꾸인가 꼭! 있는 오타😁

 

그래도 실수한 부분을 찾아내서 다행이다 속이 다 시원해라!

따라 만들고 있는 투두리스트를 끝내고 나면, 두세번씩 반복하면서 form_valid가 뭔 지 추가로 정리해놔야지

 

코딩은 따라해보면서 배우는 거니까,

오늘의 실수도 언젠가는 도움이 될꺼야

파이팅!

728x90