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)

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

[
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…
![](assets/images/2023/02/apple-touch-icon@2.png?ssl=1)
](https://stackoverflow.com/questions/32998300/django-createview-how-to-perform-action-upon-save)
Share: Twitter Facebook
Bongjun Hur's Picture

About Bongjun Hur

BJ is a dev.

Seoul, Korea https://devbj.com