doableware / djongo

Django and MongoDB database connector
https://www.djongomapper.com
GNU Affero General Public License v3.0
1.88k stars 355 forks source link

Error: 'NoneType' obejct is not iterable when multiple array models are nested #278

Open RuchitMicro opened 5 years ago

RuchitMicro commented 5 years ago

I have an ArrayModelField inside a model which contains another ArrayModelField, Now for some reasons django admin displays me the nested form but when I save the data it throws this error 'NoneType' object is not iterable

Models.py `from djongo import models from django import forms

class variantValue(models.Model): value = models.CharField(max_length=50) sku = models.CharField(max_length=50) addition_price = models.CharField(max_length=50)

def __str__(self):
    return self.value
class Meta:
    abstract = True

class variantValueForm(forms.ModelForm): class Meta: model = variantValue fields = 'all'

class variant(models.Model): name = models.CharField(max_length=50) value = models.ArrayModelField( model_container = variantValue, model_form_class= variantValueForm ) def str(self): return self.name class Meta: abstract = True

class variantForm(forms.ModelForm): class Meta: model = variant fields = 'all'

class product(models.Model): name = models.CharField(max_length=100) variant = models.ArrayModelField( model_container=variant, model_form_class=variantForm ) def save(self, *args, *kwargs): super(product, self).save(args, **kwargs) def str(self): return self.name`

`Environment:

Request Method: POST Request URL: http://127.0.0.1:8000/admin/variant/product/add/

Django Version: 2.2.1 Python Version: 3.6.7 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'variant'] 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']

Traceback:

File "/home/devomark/ecom/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner

  1. response = get_response(request)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response

  1. response = self.process_exception_by_middleware(e, request)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response

  1. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/contrib/admin/options.py" in wrapper

  1. return self.admin_site.admin_view(view)(*args, **kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapped_view

  1. response = view_func(request, *args, **kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/views/decorators/cache.py" in _wrapped_view_func

  1. response = view_func(request, *args, **kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/contrib/admin/sites.py" in inner

  1. return view(request, *args, **kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/contrib/admin/options.py" in add_view

  1. return self.changeform_view(request, None, form_url, extra_context)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapper

  1. return bound_method(*args, **kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/utils/decorators.py" in _wrapped_view

  1. response = view_func(request, *args, **kwargs)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/contrib/admin/options.py" in changeform_view

  1. return self._changeform_view(request, object_id, form_url, extra_context)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/contrib/admin/options.py" in _changeform_view

  1. form_validated = form.is_valid()

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/forms.py" in is_valid

  1. return self.is_bound and not self.errors

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/forms.py" in errors

  1. self.full_clean()

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/forms.py" in full_clean

  1. self._clean_fields()

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/forms.py" in _clean_fields

  1. value = field.clean(value)

File "/home/devomark/ecom/lib/python3.6/site-packages/djongo/models/fields.py" in clean

  1. if form_set.is_valid():

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/formsets.py" in is_valid

  1. self.errors

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/formsets.py" in errors

  1. self.full_clean()

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/formsets.py" in full_clean

  1. if not form.has_changed() and i >= self.initial_form_count():

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/forms.py" in has_changed

  1. return bool(self.changed_data)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/utils/functional.py" in get

  1. res = instance.dict[self.name] = self.func(instance)

File "/home/devomark/ecom/lib/python3.6/site-packages/django/forms/forms.py" in changed_data

  1. if field.has_changed(initial_value, data_value):

File "/home/devomark/ecom/lib/python3.6/site-packages/djongo/models/fields.py" in has_changed

  1. for init in initial:

Exception Type: TypeError at /admin/variant/product/add/ Exception Value: 'NoneType' object is not iterable admin `

RuchitMicro commented 5 years ago

error

iserranoe commented 5 years ago

Same problem here, did you solve it?

scherbakovx commented 5 years ago

Hello! I'm with the same problem :(

pabloliberona commented 5 years ago

Hello, here with the same problem

brunowego commented 3 years ago

Anybody find a solution for this? Thanks.