2011-01-31 16 views
11

Czy istnieje sposób na pobranie typu zawartości pliku do przesłania podczas nadpisywania metody zapisywania modeli? Próbowałem tego:Django - Pobierz typ pliku/typ MIME

def save(self): 
    print(self.file.content_type) 
    super(Media, self).save() 

Ale to nie zadziałało. W tym przykładzie, self.file jest model.FileField:

file = models.FileField(upload_to='uploads/%m-%Y/') 

Edit: Chciałbym być w stanie zaoszczędzić typ zawartości w bazie danych, więc muszę go przed oszczędzania jest rzeczywiście pełna :)

+0

Myślę, że plik jest zapisany po save() jest wykonywana. Mogę być złą myślą. Więc spróbuj odwrócić 2. i 3. linię wokół, więc zapisz(), a następnie wydrukuj(). – dotty

+0

To zadziałało, ale będę musiał pobrać dane przed ręką, ponieważ chcę zapisać typ zawartości do bazy danych. Powinienem był o tym wspomnieć w pierwotnym pytaniu. – Hanpan

+0

Więc zapisz, pobierz typ MIME, wypełnij pole typu treści, potem super (...). Zapisz ponownie. Powinien działać jak aktualizacja. – Spacedman

Odpowiedz

25
class MyForm(forms.ModelForm): 

    def clean_file(self): 
     file = self.cleaned_data['file'] 
     try: 
      if file: 
       file_type = file.content_type.split('/')[0] 
       print file_type 

       if len(file.name.split('.')) == 1: 
        raise forms.ValidationError(_('File type is not supported')) 

       if file_type in settings.TASK_UPLOAD_FILE_TYPES: 
        if file._size > settings.TASK_UPLOAD_FILE_MAX_SIZE: 
         raise forms.ValidationError(_('Please keep filesize under %s. Current filesize %s') % (filesizeformat(settings.TASK_UPLOAD_FILE_MAX_SIZE), filesizeformat(file._size))) 
       else: 
        raise forms.ValidationError(_('File type is not supported')) 
     except: 
      pass 

     return file 

settings.py

TASK_UPLOAD_FILE_TYPES = ['pdf', 'vnd.oasis.opendocument.text','vnd.ms-excel','msword','application',] 
TASK_UPLOAD_FILE_MAX_SIZE = "5242880" 
+1

Jak nazywasz clean_file? –

+0

clean_file jest generalnie wywoływany, gdy musisz sprawdzić poprawność formularza za pomocą is_valid() –

+4

Myślę, że wyjątek powinien złapać AttributeError. W przeciwnym razie, czy formularze.ValidationError nie zostaną połknięte? –

5

Zgodnie z docs, Twój kod widoku, który obsługuje przesyłanie formularz powinien być w stanie uzyskać MIME (z zastrzeżeniami) w bitach request.FILES

Ostatnim z elementów układanki jest obsługi rzeczywisty plik dane z zapytania request.FILES. Każdy wpis w tym słowniku jest obiektem UploadedFile - prostym opakowaniem wokół przesłanego pliku. Zwykle będziesz używać jednego z tych metod dostępu przesłanego zawartość:

klasy UploadedFile¶ oprócz te odziedziczone pliku, wszystkie UploadedFile obiekty określić następujących metod/atrybuty:

UploadedFile .content_type Nagłówek treści typu przesłany z plikiem (np. tekst/zwykły lub aplikacja/pdf). Podobnie jak inne dane dostarczone przez użytkownika, nie powinieneś ufać, że przesłany plik to w rzeczywistości tego typu. Nadal będziesz potrzebować do sprawdzenia, czy plik zawiera treść , której nagłówek typu zawartości oświadcza - "zaufaj, ale zweryfikuj".

To wszystko jest tutaj: http://docs.djangoproject.com/en/1.2/topics/http/file-uploads/ (choć wyciąłem n wklej z docs dev powyżej ...)

ja nie widzę content_type modelu FileField s w ogóle w docs ...