2016-01-12 1 views
1

Я обновляюсь с Django 1.6 до 1.7, и я сталкиваюсь с непростой проблемой. У меня есть поле для модели профильного изображения, как это:Рефакторинг для Django 1.7

profile_image = models.ImageField(
    upload_to=get_user_uploadto_callable('photos'), null=True, 
    verbose_name=_('photo'), blank=True) 

... и мой get_user_uploadto_callable выглядит следующим образом:

def get_user_uploadto_callable(subdir): 
    '''Return a callable that returns a custom filepath/filename 
    for an uploaded file as per `get_user_upload_path`. 

    ''' 

    def _callable(instance, filename): 
     return get_user_upload_path(instance, subdir, filename) 

    return _callable 

Однако это уже не приемлемо для Django, и причины этого ошибка при попытке сделать миграции:

ValueError: Could not find function _callable in myproj.core.util. 
Please note that due to Python 2 limitations, you cannot serialize unbound method functions (e.g. a method declared 
and used in the same class body). Please move the function into the main module body to use migrations. 
For more information, see https://docs.djangoproject.com/en/1.7/topics/migrations/#serializing-values 

Так что мне нужно, чтобы переместить эту _callable вне метода (вероятно, переименовать его в нечто вроде user_uploadto_callable), но S до получения доступа к аргументу subdir. Есть ли чистый способ сделать это?

ответ

1

Невозможно использовать результат get_user_uploadto_callable как вызываемый в Python 2, но вы можете определить функцию, которая делает то же самое.

def profile_image_upload_to(): 
    # you can reduce this to one line if you prefer, I used 
    # two to make it clearer how it works 
    callable = get_user_uploadto_callable('photos') 
    return callable() 

class MyModel(models.Model): 
    profile_image = models.ImageField(
     upload_to=profile_image_upload_to, null=True, 
     verbose_name=_('photo'), blank=True) 
+0

К сожалению, это дает мне ту же ошибку: похоже, проблема заключается в том, что функция '_callable' находится внутри другого определения функции. – benwad

+0

Спасибо, эта версия работает! В идеале, хотя было бы неплохо добавить аргумент в определение поля, но я знаю, что это может быть невозможно в Python 2 с системой миграции Django. Я подожду немного, чтобы принять этот ответ, если произойдет что-то волшебное ... – benwad

Смежные вопросы