2016-04-30 6 views
0

In einem meiner Django-Projekt versuche ich, Dateien hochzuladen. Dateien können Videodateien sein und 20 MB groß sein. Ich versuche, es mit Sellerie und Upload_file_handler Methode in Django docs hochladen.Benötigen Sie ein Beispiel für Django big Datei-Upload mit Upload-Datei-Handler-Methode

Was ich getan habe ist es.

class MyVideo(models.Model): 
    user = models.ForeignKey(User) 
    video = models.FileField(null=True, blank=True, upload_to="video") 

    def __unicode__(self): 
     return self.user.username 

In forms.py

class VideoForm(forms.ModelForm): 
    video = forms.FileField(required=False) 

    class Meta: 
     model = MyVideo 
     exclude = ['user'] 

    def clean_video(self): 
     video = self.cleaned_data['video'] 
     if video and video._size > (10 * 1024 * 1024): 
      raise forms.ValidationError("only 10 MB video is allowed") 
     return self.cleaned_data['video'] 

In View.py

class CreateDigitalAssetsView(LoginRequiredMixin, CreateView): 

template_name = "video_create.html" 
form_class = VideoForm 

def get_success_url(self): 
    return reverse("video_url") 

def form_valid(self, form): 
    user = self.request.user 
    video = form.cleaned_data['video'] 

    if video: 
     handle_uploaded_file(video) 
     # stick here what to do next. 

def handle_uploaded_file(f): 
    filename, extension = os.path.splitext(video.name) 
    with open('media/video/'+filename, 'wb+') as destination: 
     for chunk in f.chunks(): 
      destination.write(chunk) 

Ich bin hier fest, was nach dem Aufruf handled_uploaded_file als nächstes zu tun. Bitte führen Sie mich, wie kann ich diese geschriebene Datei mit Hilfe von hanldle_uploaded_file im Django-Modell speichern.

Antwort

0

Sie müssen den Pfad der erstellten Datei (relativ zum/media root) von Ihrer Funktion handle_uploaded_file zurückgeben und diese dann im Videofeld des Modells speichern.

So etwas wie:

def handle_uploaded_file(f): 
    filename, extension = os.path.splitext(video.name) 
    relative_path = "video/%s" % filename 
    full_path = "media/%s" % relative_path 
    with open(full_path, 'wb+') as destination: 
    for chunk in f.chunks(): 
     destination.write(chunk) 
    return relative_path 

def form_valid(self, form): 
    ... 

    if video: 
     relative_path = handle_uploaded_file(video) 
     form.instance.video = relative_path 
     form.instance.save() 
+0

schon versucht, diese auf lokalen Arbeits in Ordnung. Vielen Dank. Aber es gibt einen IO-Fehler auf dem Server mit dem Namen Kein solches Verzeichnis "media /% s"% relativer_pfad existiert. – user2534069

+0

Klingt wie der Media-Root auf Ihrem Server an einem anderen Ort ist. Enthält Ihre settings.py einen MEDIA_ROOT-Eintrag? Wenn ja, sollten Sie dies als Grundlage anstelle von "media /" verwenden. Details finden Sie unter https://docs.djangoproject.com/de/dev/ref/settings/#media-root. – georgeofallages

+0

Ja, Sie hatten Recht. MEDIA_ROOT zeigte auf BASE_DIR + Medien – user2534069

Verwandte Themen