Quiero solicitar una función automática de una clase modelo como tal en upload_to:
class Foo(models.Model): filestack = models.FileField(upload_to=self. gen_save_path) def gen_save_path(self): """ gen_save_path: void -> String Generates the path as a string for fileStack field. """ return "some generated string"
Sin embargo, estoy obteniendo NameError: name 'self' is not defined
error
filestack
es un atributo de clase y mientras lo declara, no puede usar self porque no hay ningún objeto de class ( self
) creado, de todos modos, de acuerdo con django docs upload_to
toma dos argumentos, instancia (una instancia del modelo donde se define FileField) y el nombre de archivo (el nombre de archivo que se le dio originalmente al archivo), por lo que puede configurar upload_to
para dicha función
def gen_save_path(instance, filename): """ gen_save_path: void -> String Generates the path as a string for fileStack field. """ return "some generated string" class Foo(models.Model): filestack = models.FileField(upload_to=gen_save_path)
Si desea incluir gen_save_path
dentro de la clase, puede usar un lambda para llamar self.gen_save_path
por ejemplo
class Foo(models.Model): filestack = models.FileField(upload_to=lambda self, fname:self.gen_save_path(fname)) def gen_save_path(self, filename): return "some generated string"
Creo que esto funcionará si usas una función lambda:
class Foo(models.Model): filestack = models.FileField(upload_to=lambda: self.gen_save_path()) def gen_save_path(self): """ gen_save_path: void -> String Generates the path as a string for fileStack field. """ return "some generated string"
en su código, el filestack es una variable de scope de clase ya que no está definida en un método. así que no hay un yo disponible en este ámbito.
Creo que puedes usar:
filestack =models.FileField(upload_to=Foo.gen_save_path)
o
define el valor de la stack de archivos dentro de un constructor __init__
, donde puedes usar self!