본문 바로가기
웹 개발 이야기/django

[django] DB에 담긴 파일 삭제

by Gommin 2023. 5. 11.

urls.py

from django.conf.urls.static import static
from django.conf import settings
from . import views

urlpatterns = [
path('program/pimgdelete/', views.pimgdelete, name='pimgdelete'),
]

 

views.py

def pimgdelete(request):
    pk = request.POST.get('pk')
    fieldname = request.POST.get('fieldname')
    if pk is None:
        result = HttpResponse('pk is nothing')
    elif fieldname is None:
        result = HttpResponse('fieldname is nothing')
    else:
        my_object = Program.objects.filter(pk=pk)
        obj = my_object[0]

        # 파일의 실제 위치 검색
        file_path = os.path.join(settings.MEDIA_ROOT, str(getattr(obj, fieldname, '')))
        if os.path.exists(file_path):
            # 파일 삭제
            os.remove(file_path)
            # 파일 필드 초기화
            setattr(obj, fieldname, None)
            # DB 저장
            obj.save()

            result = HttpResponse('Y')
        else:
            result = HttpResponse('file path error')

    return result

 

program.html

// 폼 안에 {% csrf_token %} 를 작성해야한다.
// 페이지 뷰에서 보낸 program_data의 pk와 DB 테이블의 항목명을 파라미터로 보낸다.

function del_img(){
        const csrfToken = document.getElementsByName('csrfmiddlewaretoken')[0].value;
        $.ajax({
            type: "POST",
            url: "{% url 'csadmin:pimgdelete' %}",
              headers: { 'X-CSRFToken': csrfToken },
            data: {pk:{{program_data.pk}}, fieldname:'pimg'},
            cache: false,
                 datatype: "JSON",
            success: function(data, textStatus, xhr){
                console.log(data);
                if(data == 'Y'){ location.reload(); }
                else{ alert(data); }
            }
        });
    }

댓글