티스토리 뷰

 장고에서는 기본적으로 제공해주는 어드민이 있다.

 처음에 봤을땐 그냥 데이터베이스 직접 보는거랑 이게 뭔 차이인가.. 하는 생각을 했었는데, 문서(Django Document link)를 읽어보니 제법 기능이 많았다.

 간편하게 커스터마이징하기 쉬운 것은 아래와 같다.

 

  1. list_display
    • 말 그대로 모델어드민의 리스트 상에서 어떤 목록이 보여질지를 정하는 것이다. 해당 모델의 컬럼 중에서 리스트 상에서 보여줄 컬럼을 정할 수 있다 
  2. list_display_links 
    • 리스트 상에서 해당 객체의 수정 페이지로 이동하는 링크를 어떤 컬럼에 걸지 정한다. 당연히 여기에서 지정하는 필드는 list_display에도 있어야 한다.
  3. list_filter
    • 오른쪽 사이드바에 필터를 활성화하고, 어떤 컬럼값으로 필터링할지 정한다.
  4. search_fields
    • 검색시 검색 가능한 필드 종류를 정한다. foreign key도 <model>__<FK>_<FK field>의 형태로 추가한 후 검색할 수 있다. 

 그리고 actions가 있다. (링크)

 기본적으로 객체를 삭제하는 액션이 하나있고, 함수 지정 등을 통해서 새로운 액션을 추가할 수 있다.

 나의 경우에는 리스트 상에서 id가 같은 파일을 여러 개 선택해서 zip파일로 다운받고 싶다는 요청이 들어와 관련 액션을 추가했다.

 해당 액션명은 download_files 이고, 관련 함수는 아래와 같이 작성했다.

def download_files(modeladmin, request, queryset):
    import os, requests, shutil, zipfile
    from django.conf import settings
    from django.http import HttpResponse, HttpResponseServerError
    try:
        id = str(queryset.first().id())
        file_path = settings.MEDIA_ROOT
        if not os.path.exists(file_path):
            os.makedirs(file_path)
        for obj in queryset:
            req = requests.get(obj.file.url, allow_redirects=True)
            open(f'{file_path}/', 'wb').write(req.content)
        shutil.make_archive(f'{settings.MEDIA_ROOT}/', 'zip', file_path)
        zip_path = os.path.join(settings.MEDIA_ROOT, f'{id}.zip')
        response = HttpResponse(open(zip_path, 'rb'), content_type='application/zip')
        response['Content-Disposition'] = f'attachment; filename={id}.zip'
        shutil.rmtree(file_path)
        os.remove(zip_path)
        return response
    except Exception as e:
        return HttpResponseServerError(str(e))

download_files.short_description = "선택된 파일들을 모두 다운로드"

이후 해당 모델의 actions에 해당 함수를 추가했고 작동하는 것을 확인할 수 있었다!

 

 

반응형
댓글