사용자 친화적 인 다중 / 대량 파일 업로드 기능을 다른 앱에 제공 할 수있는 Django 앱
문제
나는 정직 할 것입니다 : 이것은 지난주 Django-Users Mailinglist에 대해 묻는 질문입니다. 아직 거기에 답장을받지 못했기 때문에 여기에서 더 많은 관심을 받기를 희망하여 스택 오버플로에 다시 게시하고 있습니다.
자체 앱에서 사용자 친화적 인 다중 / 대량 파일 업로드를 쉽게 수행 할 수있는 앱을 만들고 싶습니다. 사용자 친화적 인 경우 gmail, flickr와 같은 업로드를 의미합니다. 여기서 사용자는 찾아보기 파일 대화 상자에서 한 번에 여러 파일을 선택할 수 있습니다. 그런 다음 파일이 순차적으로 또는 병렬로 업로드되며 선택한 파일의 멋진 개요가 페이지에 옆에있는 진행 막대가있는 페이지에 표시됩니다. '취소'업로드 버튼도 가능한 옵션입니다.
그 모든 niceness는 일반적으로 플래시 객체를 사용하여 해결됩니다. 다음과 같이 클라이언트 측을위한 완전한 솔루션이 있습니다 : swfuploadhttp://swfupload.org/ , FancyUpload http://digitarald.de/project/fancyupload/, yui 2 업 로더 http://developer.yahoo.com/yui/uploader/ 그리고 아마도 더 많은 것입니다.
물론이 트릭은 프로젝트에 솔루션을 통합하는 것입니다. 특히 Django와 같은 프레임 워크에서는 다시 재사용 할 수 있으려면 두 배가됩니다.
그래서 몇 가지 아이디어가 있지만 Django 나 플래시 기반 업로드 솔루션에 대한 전문가는 아닙니다. 지식이 풍부하고 경험이 풍부한 사람들로부터 피드백을 받기를 희망하면서 여기에서 내 아이디어를 공유하겠습니다. (또는 심지어 '나도 원해요!'대답 :))
당신은 내가 몇 가지 가정을한다는 것을 알게 될 것입니다 : 이것은 응용 프로그램의 (초기) 범위를 제어하에 유지하는 것입니다. 이러한 가정은 물론 논쟁의 여지가 있습니다.
좋아, 내 아이디어는 지금까지 :
여러 파일을 업로드하려면 각 파일을 포함시키는 모델이 있습니다. 즉, 모델에는 하나의 파일 필드 또는 하나의 ImageField가 포함됩니다. 여러 파일 필드/ 이미지 필드가 다수의 (그러나 물론 유한 한) 양의 모델을 쉽게 업로드 할 필요가 없습니다. IMHO : 100 파일 필드가있는 모델이 있으면 뭔가 잘못하고 있습니다 :) 예상 내 예상식 질량 업로드를 원하는 예.
- 파일 필드가있는 모델 '브로셔', 제목 필드 (파일 이름에서 동적으로 생성) 및 date_added 필드가있는 앱.
- 모델 '갤러리'및 '사진'이있는 사진 갤러리 앱. 사진을 추가 할 갤러리를 선택하고 사진을 업로드하고 새 사진 객체가 만들어지고 외국 키가 선택된 갤러리로 설정됩니다.
좋아하는 플래시 업로드 솔루션의 앱을 구성하거나 확장 할 수있어서 좋을 것입니다. 위의 세 가지 중 하나를 기본값으로 선택할 수 있지만 앱을 구현하여 사람들이 추가 구현을 쉽게 추가 할 수 있도록 (Django가 여러 데이터베이스를 사용할 수 있음)를 쉽게 추가 할 수 있습니다. 특정 클라이언트 측 솔루션에 적합하지 않도록하십시오.
처음부터 선택해야한다면 가장 작은 발자국으로 하나를 골라 낼까요? (클라이언트 측면에서 가장 작은 다운로드)
플래시 기반 솔루션은 파일을 URL에 비동기 적으로 (그리고 순차적으로 또는 병렬로) 게시합니다. URL은 제네릭 앱에 로컬에있는 것이 좋습니다 (따라서 앱을 사용하는 모든 앱마다 동일합니다). 그 URL은 제네릭 앱에서 제공 한보기로 이동합니다.
보기는 다음을 수행합니다. 새 모델 인스턴스를 만들고 파일을 추가하고 선택적으로 추가 작업을 수행하고 인스턴스를 저장합니다.
추가 작업을 수행하는 것은 앱을 사용하는 앱이 실행하려는 코드입니다. 모델에 파일 필드/ImageField 만 있으면 추가 코드를 제공 할 필요가 없습니다. 표준보기 코드가 작업을 수행합니다. 그러나 대부분의 앱은 다른 필드를 채우는 것과 같이 내가 생각하는 여분의 일을 원할 것입니다 : Title, Date_added, 외국 키, Manytomany, ...
나는 여분의 일을위한 메커니즘에 대해 아직 생각하지 않았다. 일반적인 앱보기를 마무리하는 것만으로도 떠오 웠지만 개발자 친화적이지는 않습니다. 자신의 URL 패턴과 자신의보기를 작성해야하기 때문입니다. 그러면 새 URL 등을 사용하려면 플래시 솔루션을 알려야합니다 ... 여기에서 신호와 같은 것이 사용될 수 있다고 생각합니까?
Forms/Admin : 나는이 모든 것이 관리자 또는 일반적인 Django 양식/위젯에 가장 잘 통합 될 수있는 방법에 대해 여전히 매우 스케치하고 있습니다. (그리고 이것은 Django 경험 쇼의 부족이었습니다) :
- 갤러리/사진 앱의 경우 : 갤러리 세부 정보 양식에 대량 사진 업로드 위젯을 제공 할 수 있습니다. 그러나 갤러리 인스턴스가 아직 저장되지 않으면 어떻게해야합니까? 파일 업로드보기는 사진 인스턴스에서 외국 키를 설정할 수 없습니다. Auth 앱은 사용자를 만들 때 먼저 사용자 이름과 비밀번호를 요청한 다음 Haleadres를 채우거나 역할을 선택하는 더 큰 양식을 제공합니다.
- 단 하나의 모델 만있는 앱의 경우 : Django 관리자에게 질량 업로드를 수행하기 위해 양식을 어떻게 제공합니까? 당신은 당신의 모델의 세부 형태로 그것을 할 수 없다. 그것은 단지 하나의 모델 인스턴스를위한 것입니다.
이 앱에서 시작하기 전에 답변을 받아야하는 수십 가지 더 많은 질문이있을 것입니다. 그러니 당신의 생각을 말 해주세요! 나에게 입력을 줘! 당신은 무엇을 좋아합니까? 그렇지 않습니까? 당신은 무엇을 다르게 하시겠습니까? 이 아이디어는 견고합니까? 어디에 있지 않습니까?
고맙습니다!
해결책
방금 약 한 달 전에 이것을 위해 간단한 앱을 출시했습니다. Django-Uploadify.
기본적으로 Django 템플릿 태그입니다. 업로드 (jQuery 필요). 그것을 사용하면 템플릿에 이것을 추가하는 것만 큼 간단합니다 ...
{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %}
태그는 수신 파일이 수신 된시기를 나타내는 클라이언트 측 및 서버 측 (DJANGO 신호) 모두에서 이벤트 (파일 당 1 개)를 발사합니다.
예를 들어, 모든 사용자가 지원 파일을 처리하는 모델 '미디어'가 있다고 가정합니다.
def upload_received_handler(sender, data, **kwargs):
if file:
new_media = Media.objects.create(
file = data,
new_upload = True,
)
new_media.save()
upload_recieved.connect(upload_received_handler, dispatch_uid=‘whatever.upload_received’)
확인하십시오 위키 설정 방법에 대한 정보는 신호 처리기 (클라이언트/서버)를 작성하는 방법에 대한 정보를 보려면.
위의 개념적 구현에 대해 다음은 몇 가지 고려 사항이 있습니다.
- 앱이 "파일 모델"인스턴스를 자동으로 생성하도록하면 사람들이 이미 작업중 인 자체 모델을 가지고있을 수 있습니다.
- 모든 유형의 보안 또는 인증을 구현하려면 공개 시스템이 필요하고 '자동 창작'유형이 적습니다.
- 나는 신호/이벤트가 이것을 처리하는 방법이라고 생각하고, 당신이 언급 한 것의 '다른 일'부분을 처리합니다.
- 나의 결론은 다중 단체가 실제로 폼 위젯이 형태 위젯을 구현한다는 의미에서 결코 형태 위젯이 될 수 없다는 것이었다. 1 파일 1은 1 모델 인스턴스 (일부 예외 포함)로 표시 될 가능성이 높습니다. 즉, 1 개의 위젯이 N 모델 인스턴스를 나타내는 상황이 있습니다. 그러나 Django는 설정되어 위젯이 1 인스턴스에서 1 필드에 대해 1 값을 나타냅니다. 대부분의 사용 사례가 위젯으로 사용하는 데 적합하지 않습니다 (따라서 템플릿 태그 경로를 사용한 이유).