#python #django #amazon-s3 #sorl-thumbnail
#питон #джанго #amazon-s3 #sorl-миниатюра
Вопрос:
При попытке получить доступ к профилю пользователя в моей панели администратора я начал сталкиваться с этой проблемой.
TypeError at /admin/users/userprofile/2/
'NoneType' object has no attribute '__getitem__'
Это только начало происходить после того, как я интегрировал хранилища Django в свое приложение для использования службы хранения Amazon S3. Я не могу понять, что здесь противоречиво. Обратная трассировка, похоже, предполагает, что проблема связана с sorl thubmnails, которые я использую для своего поля пользовательского изображения.
Вот мой settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
STATICFILES_STORAGE = 'storages.backends.s3boto.S3BotoStorage'
AWS_ACCESS_KEY_ID = 'my-access-key'
AWS_SECRET_ACCESS_KEY = 'my-secret-key'
AWS_STORAGE_BUCKET_NAME = 'my-bucket-name'
STATIC_URL = 'http://' AWS_STORAGE_BUCKET_NAME '.s3.amazonaws.com/'
ADMIN_MEDIA_PREFIX = STATIC_URL 'admin/'
Вот моя пользовательская модель
from sorl.thumbnail import ImageField
class UserProfile(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
username = models.CharField(max_length=100, unique=True)
name = models.CharField(max_length=255)
location = models.CharField(max_length=255, blank=True, null=True)
website = models.CharField(max_length=255, blank=True, null=True)
image = ImageField(upload_to='media', blank=True, null=True)
points = models.PositiveIntegerField(default=0)
added_on = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
Вот обратная связь с этой проблемой
Environment:
Request Method: GET
Request URL: http://www.localhost/admin/users/userprofile/2/
Django Version: 1.6.5
Python Version: 2.7.3
Installed Applications:
('django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'south',
'rest_framework',
'django_extensions',
'debug_toolbar',
'django_jinja',
'django_statsd',
'django_user_agents',
'alphafilter',
'redis_status',
'subdomains',
'pipeline',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.facebook',
'allauth.socialaccount.providers.twitter',
'allauth.socialaccount.providers.google',
'sorl.thumbnail',
'storages',
'brands',
'cachier',
'categories',
'crawler',
'deals',
'features',
'facets',
'products',
'stores',
'users',
'util')
Installed Middleware:
('buyingiq.middleware.TimerMiddleware',
'debug_toolbar.middleware.DebugToolbarMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'subdomains.middleware.SubdomainURLRoutingMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django_user_agents.middleware.UserAgentMiddleware',
'buyingiq.middleware.VisitorMiddleware')
Template error:
In template /home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
'NoneType' object has no attribute '__getitem__'
9 : {% for field in line %}
10 : <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
11 : {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
12 : {% if field.is_checkbox %}
13 : {{ field.field }}{{ field.label_tag }}
14 : {% else %}
15 : {{ field.label_tag }}
16 : {% if field.is_readonly %}
17 : <p>{{ field.contents|linebreaksbr }}</p>
18 : {% else %}
19 : {{ field.field }}
20 : {% endif %}
21 : {% endif %}
22 : {% if field.field.help_text %}
23 : <p class="help">{{ field.field.help_text|safe }}</p>
24 : {% endif %}
25 : </div>
26 : {% endfor %}
27 : </div>
28 : {% endfor %}
29 : </fieldset>
Traceback:
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
137. response = response.render()
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/response.py" in render
105. self.content = self.rendered_content
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/response.py" in rendered_content
82. content = template.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
140. return self._render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
85. return self.nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
123. return compiled_parent._render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
85. return self.nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
123. return compiled_parent._render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
85. return self.nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
62. result = block.nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
62. result = block.nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
196. nodelist.append(node.render(context))
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
155. return self.render_template(self.template, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render_template
137. output = template.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
140. return self._render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
85. return self.nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
196. nodelist.append(node.render(context))
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
196. nodelist.append(node.render(context))
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
305. return nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/defaulttags.py" in render
305. return nodelist.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
840. bit = self.render_node(node, context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render_node
78. return node.render(context)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/template/debug.py" in render
91. output = force_text(output)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/utils/encoding.py" in force_text
100. s = s.__unicode__()
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/forms/forms.py" in __str__
425. return self.as_widget()
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/django/forms/forms.py" in as_widget
475. return widget.render(name, self.value(), attrs=attrs)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/sorl/thumbnail/admin/current.py" in render
34. ) % (mini.width, value.url, mini.url, output)
File "/home/jaskaran/coding/buyingiq/buyingiq/venv/local/lib/python2.7/site-packages/sorl/thumbnail/images.py" in width
51. return self.size[0]
Exception Type: TypeError at /admin/users/userprofile/2/
Exception Value: 'NoneType' object has no attribute '__getitem__'
Комментарии:
1. кем вы ожидаете
self.size[0]
стать?2. @PadraicCunningham Это часть пакета solr. Я бы предположил, что он возвращает ширину изображения.
3. Я посмотрел на источник, и это ширина, ошибка возникает
field.field
в строке 19, html, конечно, не моя сильная сторона, но то, что должно быть указано. поле быть?4. Я загрузил новое изображение через my view, и ошибка теперь исчезла. Я думаю, это, вероятно, связано с тем, что последнее изображение не было размещено на S3 правильно.
5. Это звучит довольно логично, self.size [0] был None, так что это имело бы смысл.
Ответ №1:
Ошибка была вызвана отсутствием файла изображения для атрибута изображения. Проверьте путь к файлу для UserProfile.image пользователя (ID = 2).
Возможно, вы скопировали код и базу данных из одного места в другое, но вы не скопировали связанные файлы изображений.