2010-08-17 15 views
21

yo estaba tratando de asignar un archivo de mi disco a la FileField, pero tengo este error:¿Cómo asignar un archivo local al FileField en Django?

AttributeError: 'str' objeto no tiene atributo 'abrir'

Mi código Python:

pdfImage = FileSaver() 
pdfImage.myfile.save('new', open('mytest.pdf').read()) 

y mi models.py

class FileSaver(models.Model): 

    myfile = models.FileField(upload_to="files/") 

    class Meta: 
     managed=False 

Gracias de antemano por su ayuda

Respuesta

32

Django usa su propio file type (con una funcionalidad mejor vista). De todos modos, el tipo de archivo de Django funciona como decorator, por lo que puede simplemente envolverlo con los objetos de archivo existentes para satisfacer las necesidades de la API de Django.

from django.core.files import File 

local_file = open('mytest.pdf') 
djangofile = File(local_file) 
pdfImage.myfile.save('new', djangofile) 
local_file.close() 

Se puede decorar, por supuesto, el archivo sobre la marcha escribiendo lo siguiente (una línea menos):

pdfImage.myfile.save('new', File(local_file))`. 
+3

una sobreescritura es probablemente una mala idea. Es mejor usar el archivo_ –

+7

Solo para explicar el comentario anterior (me confundí por un momento) Aaron está hablando del símbolo 'archivo' (es decir, el nombre de la variable) en lugar del tipo de argumento pasado. – Joe

Cuestiones relacionadas