对象类型' NoneType'没有len() - 编辑表格

时间:2017-01-18 08:33:15

标签: python django cloudinary

我有一个Profile模型,它具有用户模型的外键。我创建了一个编辑个人资料'允许用户更新配置文件信息的视图。其中一个领域是图像领域(托管与cloudinary)。由于将此字段更改为Cloudinary字段,因此当配置文件没有上传图像时,我似乎遇到了新创建的配置文件对象的问题。但是,如果用户有个人资料图片,我可以加载' edit_profile'没有问题。

我已将它缩小为图像区域,因为当我移除字段时它没有任何问题。尽管回溯不是很有帮助。

这是我的edit_profile视图。

@login_required
def edit_profile(request):
    if request.method == 'POST':
        user_form = UserForm(request.POST, request.FILES, instance=request.user)
        profile_form = ProfileForm(request.POST,request.FILES, instance=request.user.profile)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
            messages.success(request, "Successfully Updated")
            return redirect('profile:edit_profile')
        else:
            messages.success(request, "Please correct the below info")
    else:
        user_form = UserForm(instance=request.user)
        profile_form = ProfileForm(instance=request.user.profile)
    return render(request, 'profile/edit.html', {
        'user_form': user_form,
        'profile_form': profile_form
})

我有两个表单,一个用于用户模型,允许用户更新名字,姓氏和电子邮件。然后是配置文件表单,它允许更新其他字段。

我想我需要添加一些逻辑来检查图像字段是否设置为Null!?我没有在场上的设置上设置null = True,所以我有点困惑。

这是我的个人资料模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    image = CloudinaryField('image', default="thumbnail_mqe6ne")

    height = models.DecimalField(help_text="CM", max_digits=8, decimal_places=2, validators=[
        MinValueValidator(20),
        MaxValueValidator(600),
        ])

    gender_option = (
        ('Male', 'Male'),
        ('Female', 'Female'),
    )

    profile_status = (
        ('Public', 'Public'),
        ('Private', 'Private'),
    )

    birth_date = models.DateField(blank=True, default=datetime.date.today, verbose_name="Date of Birth")


    gender = models.CharField(choices=gender_option, blank=True, max_length=10)
    bio = models.TextField(max_length=300, blank=True)
    location = models.CharField(max_length=30, blank=True)


    status = models.CharField(default="Public", max_length=10, choices=profile_status)

    def __unicode__(self):
        return unicode(self.user.username)

    def get_absolute_url(self):
        return reverse("profile:profile_home", kwargs={"id": self.id})

// Traceback

Environment:


Request Method: GET
Request URL: http://localhost:8000/profile/edit/

Django Version: 1.10.4
Python Version: 2.7.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.sites',
 'stats',
 'home',
 'sorl.thumbnail',
 'storages',
 'cloudinary',
 'debug_toolbar',
 'django_cleanup',
 'allauth',
 'allauth.account',
 'allauth.socialaccount',
 'allauth.socialaccount.providers.facebook']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware']


Template error:
In template /vagrant/bodymakeover/templates/profile/edit.html, error at line 27
   object of type 'NoneType' has no len()   17 : {% comment %}{{ profile.first_name }}<br>
   18 : {{ profile.last_name }}<br>
   19 : {{ profile.bio }}<br>
   20 : {{ profile.location }}<br>
   21 : {{ profile.birthdate }}<br>{% endcomment %}
   22 : 
   23 : 
   24 : <form method="post" enctype='multipart/form-data'>
   25 :   {% csrf_token %}
   26 :   {{ user_form.as_p }}
   27 :    {{ profile_form.as_p }} 
   28 :   <button class="btn btn-primary" type="submit">Save changes</button>
   29 : </form>
   30 : 
   31 : 
   32 : </div>
   33 : 
   34 : 
   35 : {% endblock %}

Traceback:

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  39.             response = get_response(request)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
  23.                 return view_func(request, *args, **kwargs)

File "/vagrant/bodymakeover/home/views.py" in edit_profile
  54.         'profile_form': profile_form

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/shortcuts.py" in render
  30.     content = loader.render_to_string(template_name, context, request, using=using)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader.py" in render_to_string
  68.     return template.render(context, request)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/backends/django.py" in render
  66.             return self.template.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
  208.                     return self._render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  94.     return self.nodelist.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
  994.                 bit = node.render_annotated(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  961.             return self.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  174.         return compiled_parent._render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/test/utils.py" in instrumented_test_render
  94.     return self.nodelist.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
  994.                 bit = node.render_annotated(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  961.             return self.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  70.                 result = block.nodelist.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
  994.                 bit = node.render_annotated(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  961.             return self.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/loader_tags.py" in render
  70.                 result = block.nodelist.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
  994.                 bit = node.render_annotated(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render_annotated
  961.             return self.render(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in render
  1044.             output = self.filter_expression.resolve(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in resolve
  711.                 obj = self.var.resolve(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in resolve
  852.             value = self._resolve_lookup(context)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
  915.                             current = current()

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/forms.py" in as_p
  289.             errors_on_separate_row=True)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/forms.py" in _html_output
  226.                     'field': six.text_type(bf),

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/utils/html.py" in <lambda>
  382.         klass.__unicode__ = lambda self: mark_safe(klass_unicode(self))

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/boundfield.py" in __str__
  43.         return self.as_widget()

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/boundfield.py" in as_widget
  89.         attrs = self.build_widget_attrs(attrs, widget)

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/boundfield.py" in build_widget_attrs
  238.         if widget.use_required_attribute(self.initial) and self.field.required and self.form.use_required_attribute:

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/django/forms/widgets.py" in use_required_attribute
  441.         return super(ClearableFileInput, self).use_required_attribute(initial) and not initial

File "/vagrant/bodymakeover/venv/local/lib/python2.7/site-packages/cloudinary/__init__.py" in __len__
  129.         return len(self.public_id)

Exception Type: TypeError at /profile/edit/
Exception Value: object of type 'NoneType' has no len()

任何帮助都会非常感激,因为我的头靠在墙上。希望显而易见的事情:)

1 个答案:

答案 0 :(得分:0)

发生错误是因为Python正在使用len()测试真相,len(self.public_id)定义为public_id。当NoneNone时,会引发错误。

我们的SDK团队正在推动一个更全面的解决方案,该解决方案将支持CloudinaryField中的DBTimeStamp值。

作为临时解决方法,您可以在 our GHthis one上)检查社区建议的解决方案。

此外,您可以订阅问题 - here以便在修复发布后获得通知。