Django update view 함수 오버라이딩 해보기

장고 업데이트를 위해 UpdateView 를 쓰는데, 저장할때 먼가를 바꾸기 위해서 사용자 기능을 넣기 위해서는 함수를 오버라이딩을 해야 한다. 몇개 샘플로 남겨두자.

 

view 코드는 아래와 같다.

폼객체에 먼가를 수정을 가하고 싶다면 form_valid 오버라이딩 함수에서 instance 에 작업 하면 되겠다.

 

class FirmwareUpdateView(...UpdateView):

    def form_valid(self, form):
        print("form_valid override")
        instance = form.save(commit=False)
        print(self.request.FILES.items())
        for filename, file in self.request.FILES.items():
            print(filename, file, file.name, file.content_type, file.size)
            # /uploads/ 경로 문자열이 빠진 업데이트할 파일 명만 알기 위해서 이 작업을 해야 함
            instance.filename = file.name
        return super().form_valid(form)

    def dispatch(self, request, *args, **kwargs):
        # if request.method == 'POST' and METHOD_OVERRIDE_HEADER in request.META:
        #     request.method = request.META[METHOD_OVERRIDE_HEADER]
        if request.method == 'POST' :
            print("dispatch override")
            print(request.FILES.items())
            for filename, file in request.FILES.items():
                print(filename, file, file.name, file.content_type, file.size)

        return super().dispatch(request, *args, **kwargs)

    def post(self, request, **kwargs):
        # request.POST = request.POST.copy()
        print("post override")
        print(request.FILES.items())
        for filename, file in request.FILES.items():
            print(filename, file, file.name, file.content_type, file.size)
        return super().post(request, **kwargs)

 

로그를 찍어 보면 아래와 같다.

dispath

post

form_valid 순서로 불리나 보다

 

dispatch override
<generator object MultiValueDict.items at 0x000002027234AC80>
content naverband.png naverband.png image/png 4705
post override
<generator object MultiValueDict.items at 0x000002027234AC80>
content naverband.png naverband.png image/png 4705
is_valid 호출
form_valid override
<generator object MultiValueDict.items at 0x000002027234AC80>
content naverband.png naverband.png image/png 4705

미지의 세계를 탐험하는 듯한..

Tsvetoslav Hristov 님의 사진, 출처: Pexels