ошибка "getattr (): имя атрибута должно быть строкой" в панели администратора для модели с полем ImageField

у меня установлена следующая модель:

class UserProfile(models.Model):
    "Additional attributes for users."
    url = models.URLField()
    location = models.CharField(max_length=100)
    user = models.ForeignKey(User, unique=True)
    avatar = models.ImageField(upload_to='/home/something/www/avatars', height_field=80, width_field=80)

    def __unicode__(self):
        return "Profile of " + self.user.username

Он должен хранить дополнительную информацию о пользователе, например аватар.

к сожалению, когда я пытаюсь загрузить изображение через Панель администратора, это дает мне ошибку, что-то вроде:

getattr(): attribute name must be string

который не создается, когда я удаляю это поле из модели, выполните сброс БД и перезагрузите сервер. Я бы предположил, что причина в этой конкретной области, просто не уверен как.

Это мой traceback:

File "/usr/lib/pymodules/python2.6/django/core/handlers/base.py" in get_response
  92.                 response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/pymodules/python2.6/django/contrib/admin/options.py" in wrapper
  226.                 return self.admin_site.admin_view(view)(*args, **kwargs)
File "/usr/lib/pymodules/python2.6/django/views/decorators/cache.py" in _wrapped_view_func
  44.         response = view_func(request, *args, **kwargs)
File "/usr/lib/pymodules/python2.6/django/contrib/admin/sites.py" in inner
  186.             return view(request, *args, **kwargs)
File "/usr/lib/pymodules/python2.6/django/db/transaction.py" in _commit_on_success
  240.                 res = func(*args, **kw)
File "/usr/lib/pymodules/python2.6/django/contrib/admin/options.py" in add_view
  718.                 new_object = self.save_form(request, form, change=False)
File "/usr/lib/pymodules/python2.6/django/contrib/admin/options.py" in save_form
  551.         return form.save(commit=False)
File "/usr/lib/pymodules/python2.6/django/forms/models.py" in save
  407.                              fail_message, commit, exclude=self._meta.exclude)
File "/usr/lib/pymodules/python2.6/django/forms/models.py" in save_instance
  65.         f.save_form_data(instance, cleaned_data[f.name])
File "/usr/lib/pymodules/python2.6/django/db/models/fields/files.py" in save_form_data
  283.             setattr(instance, self.name, data)
File "/usr/lib/pymodules/python2.6/django/db/models/fields/files.py" in __set__
  316.             self.field.update_dimension_fields(instance, force=True)
File "/usr/lib/pymodules/python2.6/django/db/models/fields/files.py" in update_dimension_fields
  368.             (self.width_field and not getattr(instance, self.width_field))

Exception Type: TypeError at /admin/proj/userprofile/add/
Exception Value: getattr(): attribute name must be string

2 ответов


ваша проблема с height_field=80 и width_field=80 они должны содержать не требуемую высоту и ширину, а имена полей в модели, которые могут иметь значения для сохранения высоты и ширины в них.

как объяснено в документации Django для ImagedField это атрибуты вашей модели, которые будут заполнены для вас, когда модель будет сохранена. Если вы хотите, чтобы эта информация была заполнена для вас, создайте атрибут модели, где эта информация может храниться иначе просто удалите эти атрибуты они являются необязательными.


проблема, вероятно, в следующем:

height_field=80, width_field=80

height_field и width_field, Если вы их используете, должны быть именами полей в модели, которые содержат информацию о высоте и ширине. Исправьте это, это должно работать.