Django – CreateView form_valid() 오버라이딩
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)
코드 참고한 글은 아래 링크이다.