Django: вызов функции self внутри модели Django - PullRequest
2 голосов
/ 22 июня 2010

Я хочу вызвать функцию self класса модели как таковую в 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"

Однако я получаю NameError: name 'self' is not defined ошибка

Ответы [ 3 ]

3 голосов
/ 22 июня 2010

filestack является атрибутом класса, и, объявляя его, вы не можете использовать self, поскольку еще не создан объект класса (self), в любом случае согласно django docs upload_to требуется дваАргументы, экземпляр (экземпляр модели, в котором определено FileField) и имя файла (имя файла, которое было изначально задано для файла), поэтому вы можете установить upload_to для такой функции

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)

Если выЕсли вы хотите включить gen_save_path в класс, вы можете использовать лямбду для вызова self.gen_save_path например

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"
0 голосов
/ 22 июня 2010

в вашем коде, стек файлов - это переменная области видимости всего класса, поскольку она не определена в методе.поэтому в этой области нет доступного self.

Я думаю, вы можете использовать:

filestack =models.FileField(upload_to=Foo.gen_save_path)

или

определить значение filestack в конструкторе __init__, где выможете использовать себя !!

0 голосов
/ 22 июня 2010

Я думаю, что это будет работать, если вы используете лямбда-функцию:

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"
...