2009-10-26 1 views
7

나는 솔직히 말해서 이것이 지난 주 Django-Users 메일 링리스트에서 물어 본 질문입니다. 이후 아직 응답을 얻지 못했기 때문에 스택 오버플로에서 더 많은 관심을 받기를 바란다.사용자 친화적이고 다중/대량 파일 업로드 기능을 다른 앱에 제공 할 수있는 장고 앱

사용자 친화적 인 애플리케이션을 쉽게 만들고 싶습니다. 자신의 앱에 여러/대량 파일을 업로드하고 싶습니다. 사용자 친화적 인 I 은 Gmail, Flickr 등의 업로드를 의미합니다. 사용자가 파일 찾아보기 대화 상자에서 한 번에 여러 개의 파일을 선택할 수 있습니다. 그런 다음 파일이 순차적으로 또는 병렬로 에 업로드되고 선택된 파일의 멋진 개요가 페이지에 표시되며 그 옆에 진행 막대가 표시됩니다. '취소' 업로드 버튼도 가능한 옵션입니다.

일반적으로 Flash 개체를 사용하여 niceness를 해결할 수 있습니다. http://swfupload.org/, FancyUpload http://digitarald.de/project/fancyupload/ , YUI 2 업 로더 http://developer.yahoo.com/yui/uploader/ 아마 더 많은 SWFUpload : 같은 완벽한 솔루션은 클라이언트 측 위해 밖으로있다.

물론이 트릭은 프로젝트에 통합 된 솔루션을 얻고 있습니다. 특히 Django와 같은 프레임 워크에서는 double을 사용하면 을 다시 사용할 수 있습니다.

그래서 몇 가지 아이디어가 있지만 장고에 대한 전문가도 아니고 플래시 기반 업로드 솔루션도 아닙니다. 에 대해 더 많은 지식과 경험을 가진 사람들로부터 약간의 피드백을 받기를 바랍니다. (또는 심지어 단지 '나는 이것도 원한다!') 대답 :

나는 약간의 가정을합니다. 이것은 응용 프로그램의 (초기) 범위를 계속 유지하는 것입니다. 물론 논쟁의 여지가의있다 이러한 가정 :

좋아, 내 생각은 지금까지의 :

  • 당신이 대량 업로드 여러 파일을 원하는 경우 각 파일을 포함 할 모델을 할 것입니다. 즉 모델에는 FileField 또는 하나의 ImageField가 포함됩니다. FileFields/ 여러 개가있는 모델/ ImageFields를 사용하면 쉽게 대량 업로드 할 필요가 없습니다. imho : 모델에 100 개의 FileField가 있고 뭔가 잘못하고 있습니다 :) 내 예상 유형 대량 업로드 :

    • 파일 필드 (동적 파일 이름에서 생성)을 제목 필드와 DATE_ADDED 필드가 하나의 모델 '브로셔'이 앱.
    • '갤러리'및 '사진'모델이 포함 된 사진 갤러리 앱입니다. 갤러리를 선택하여 그림을 추가하고 사진을 업로드하고 새 사진 개체 을 만들고 외래 키를 선택한 갤러리에 설정합니다.
  • 좋아하는 플래시 업로드 솔루션을위한 앱을 구성하거나 확장하는 것이 좋을 것입니다.우리는 위의 세 가지 중 하나를 기본값 인 으로 선택할 수 있지만 사람들이 쉽게 추가 구현을 추가 할 수 있도록 앱을 구현합니다 (장고는 여러 데이터베이스를 사용할 수 있음). 특정 클라이언트 측 솔루션에 대해 불가지론 자 이도록하십시오.

  • 처음부터 선택해야 할 경우 이 가장 작은 풋 프린트를 선택하십시오. (클라이언트 측 물건의 최소 다운로드)

  • Flash 기반 솔루션은 비동기 적으로 (순차적으로 또는 순차적으로 병렬로) URL에 파일을 게시합니다. 일반 앱에 로컬 이라는 URL을 제안합니다 (따라서 앱을 사용하는 모든 앱에서 동일합니다). 해당 URL은 일반 앱에서 제공하는보기로 이동합니다.

  • 보기는 다음을 수행합니다. 새 모델 인스턴스를 만들고 파일을 추가하고 OPTIONALLY EXTRA STUFF를 추가하고 인스턴스를 저장하십시오.

  • DO EXTRA STUFF는 앱을 사용하는 앱이 실행하려고하는 코드입니다. 모델에 FileField/ImageField가있는 경우 추가 코드를 제공 할 필요가 없습니다. 표준보기 코드가 작업을 수행합니다. ...

  • 가 아직 DO EXTRA 물건 메커니즘에 대해 생각하지 않은 제목, DATE_ADDED, ForeignKeys를, manytomany : 그러나 대부분의 응용 프로그램은 내가 에서 다른 필드를 채우는처럼 생각 여분의 물건을 수행 할 것입니다. 단지 일반 앱보기를 래핑하는 것이 마음에 들었지만 자신의 URL 패턴과 자신의보기를 작성해야하므로 개발자는 과 친숙하지 않습니다. 그런 다음 플래시 솔루션에 새로운 URL 등을 사용하도록 알려야합니다. 신호가 사용될 수 있다고 생각합니까?

  • 양식/관리자 : 나는 여전히이 가장 잘 은 관리자에 통합하거나 할 수있는 방법에 매우 스케치 해요 일반 장고 양식/위젯/... (그리고 이것이 장고 경험의 나의 부족이 표시되었다) :

    갤러리/사진 응용 프로그램의 경우
    • : 당신은 갤러리 세부 양식의 대량 사진 업로드 위젯을 제공 할 수있다. 그러나 갤러리 인스턴스가 아직 저장되지 않은 경우 어떻게해야합니까? 파일 업로드보기는 사진 인스턴스에서 외래 키를 설정할 수 없습니다. 나는 당신이 사용자를 만들 때 auth 앱이 사용자 이름과 비밀번호를 묻기 위해 을 묻는다. 그러면 더 큰 폼을 제공하여 emailadres를 채우고 역할을 선택한다. 우리는 과 같은 것을 할 수있다.
    • 하나의 모델 만있는 앱의 경우 : Django 관리자가 대량 업로드를 수행 할 수있는 양식을 어떻게 제공합니까? 하나의 모델 인스턴스에 대해서만 모델의 세부 양식 ( )으로 수행 할 수 없습니다.

아마 내가 심지어이 응용 프로그램을 시작할 수 있습니다 전에 대답 할 필요가 수십 더 많은 질문이있다. 그래서 네가 생각하는 것을 말해줘! 내게 입력 해주세요! 너는 무엇을 좋아하니? 뭐라구? 너 뭐 다른거야? 이 아이디어는 확실한가요? 그게 어디 있지?

감사합니다.

답변

12

방금 ​​약 1 개월 전 간단한 앱을 출시했습니다 : django-uploadify.

기본적으로 Django 템플릿 태그는 매우 멋진 Uploadify (jQuery가 필요함)의 래퍼 역할을합니다. 때 들어오는

{% load uploadify_tags }{% multi_file_upload ‘/upload/complete/url/’ %} 

태그는 클라이언트 측 및 서버 측 (장고 신호) 모두에서 이벤트 (파일 당 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’) 

체크 아웃을 설정하고 신호 처리기를 만드는 방법에 대한 정보에 대한 wiki (클라이언트 서버). 위에서 당신의 개념 구현에 대한


, 여기에 고려의 몇 가지 점이다 : 사람들이 이미있을 수 있습니다만큼 강력한

  • 응용 프로그램이 자동으로 아마 "파일 모델"인스턴스를 생성 갖는되지 않은 자신의 자신이 만든 모델
  • 보안 또는 인증 유형을 구현하려면 개방형 시스템이 필요하며 '자동 생성'유형이 적음
  • 나는 신호/이벤트가 이것을 처리하고 또한 ha 당신이 언급 한 것 중 '다른 일등'부분을 달구십시오.
  • 결론 멀티 장르는 장고가 폼 위젯을 구현한다는 의미에서 결코 폼 위젯이 될 수 없다는 결론을 내 렸습니다. 1 파일은 1 모델 인스턴스 (예외가 있음)로 표시 될 가능성이 높습니다. 즉, 1 위젯이 N 모델 인스턴스를 나타낼 수있는 상황이됩니다. 그러나 Django는 위젯이 1 인스턴스의 1 필드에 대해 1 값을 나타낼 수 있도록 설정되어 있습니다. 위젯으로 사용하는 대부분의 유스 케이스에는 맞지 않습니다 (따라서 왜 템플릿 태그 경로를 사용했는지).
+0

꽤 멋져 보입니다! 한 가지 질문 : 파일 업로드시 추가 정보를 보낼 수 있습니까? 예를 들어 사진이 속한 갤러리의 PK입니다. 그럴 수 없다면 파일을받는 순간 모델을 저장할 수 없습니다. 그렇다면 FK가 null이되도록하고 새로 업로드 된 파일을 구분하는 제안 된 방법을 사용해야합니다. 그 방법으로 볼 수있는 문제는 여러 사용자가 파일을 동시에 업로드 할 수 있다는 것입니다. 더하기 : 나는 여전히 갤리에게 사진이 속하는지 알 수있는 방법이 없을 것입니다. (업로드 후 사용자가 선택하도록해야합니까?) – hopla

+0

개념적 구현 방법 : 저는 앱이 자동으로 인스턴스를 생성하게하지 않을 것입니다. 'FileModel'은 아니지만 프로그래머가 선택한 모델 (즉, 자신의 모델)을 가리 킵니다. 당신의 다른 말은 매우 통찰력있어. 고마워. 또한 : 당신이 이미 내가 원하는 것을 할 수있는 무언가를 가지고 있기 때문에, 나는 이제 그걸 해킹하려는 경향이 있습니다. – hopla

+0

앱에서 가장 잘 작동 할 패턴은 "먼저 업로드하고 질문하기"입니다. Flickr를 사용한 적이 있다면 지금까지 보았을 것입니다. 미디어 모델에는 "new_upload"(bool) 및 "uploaded_by"(사용자에게 FK)라는 두 개의 필드가 있습니다. 두 값은 파일이 업로드 될 때 설정됩니다. 클라이언트 측에서는 파일 업로드가 완료된 후 (템플릿 태그를 통해 전달 된 URL) 사용자가 새로 업로드 한 파일을 보여주는 화면으로 이동하여 갤러리 (또는 태그 또는 자르기, 또는 무엇이든) 각 파일을 개별적으로. –