Django - CreateView form_valid() 오버라이딩

Django - CreateView form_valid() 오버라이딩
Photo by Tiplada M / Unsplash

CreateView 저장 작업을 할때 커스텀 동작이 필요하다면, form_valid()를 오버라이딩해서 그냥 여기서 저장해 버리는 방법이 있다.

View를 쓴다는게 좀 커스텀 동작을 제약하는 경우와 편리성을 바꾸는 것이니 만큼 좀 불편해도 이렇게라도 변경해서 쓰자. 기본 코드는 아래와 같다.

def form_valid(self, form):
    self.object = form.save()
    # do something with self.object
    # remember the import: from django.http import HttpResponseRedirect
    return HttpResponseRedirect(self.get_success_url())

self.object 에 form 데이터가 일단 저장되고, 이 값을 이용해서 원하는 동작을 수행한다. 그리고 코드에는 get_success_url() 로 redirect 하고 있지만 원하는 어디든 보내면 된다.

내 작업에 작성한 코드도 일단 올려둔다. 많이 쓰이는 request 객체는 self.request 로 접근이 가능해서 코드 작성이 용이했다.

def form_valid(self, form):
    print("FirmwareCreateView form_valid override")
    self.object = form.save(commit=False)
    print("firmware_list request.FILES -", self.request.FILES)
    for filename, file in self.request.FILES.items():
        print("firmware_list", filename, file, file.name, file.content_type, file.size)
        self.object.filename = file.name
        if form.cleaned_data["desc"]:
        self.object.desc = form.cleaned_data["desc"]
        else:
        self.object.desc = file.name
    self.object = form.save(commit=True)

	kind = self.request.GET.get("kind")
    print("firmware_list kind", kind)
    if not kind:
        kind = definitions.FILE_TYPE_FIRMWARE
    redirect_url = reverse_lazy("firmware_list") + "?kind=" + kind
    print(redirect_url)
    return redirect(redirect_url)

코드 참고한 글은 아래 링크이다.

Django CreateView: How to perform action upon save
I’m using a custom CreateView (CourseCreate) and UpdateView (CourseUpdate) to save and update a Course. I want to take an action when the Course is saved. I will create a new many-to-many relations...