-2

I used this question as a base for creating a custom field:

Django File upload size limit

When I try to makemigrations I get an error stating that 'content_types' isn't in the kwargs. I've debugged through the code and it almost seems like my custom field init is being called twice. Once from within the model where I have this field (with the kwargs) and once without the kwargs included.

I referenced this post: How to pass additional keyword arguments in a custom Field in Django Rest Framework?

However I am already doing whatever the solution says.

class MediaField(FileField):
    def __init__(self, *args, **kwargs):
        self.content_types = kwargs.pop('content_types')
        self.max_upload_size = kwargs.pop('max_upload_size')

        super(MediaField, self).__init__(*args, **kwargs)

The field in action in the model:

media = MediaField(upload_to='media',  # this will create a folder in MEDIA_ROOT
                   content_types=['jpeg', 'jpg', 'png'],
                   max_upload_size=5242880)

the error: KeyError: 'content_types'

the stacktrace:

    (efs-cP0vQdei) user@right:~/Documents/websites/efs$ ./manage.py makemigrations
Traceback (most recent call last):
  File "./manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/core/management/base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/core/management/commands/makemigrations.py", line 133, in handle
    ProjectState.from_apps(apps),
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/db/migrations/state.py", line 222, in from_apps
    model_state = ModelState.from_model(model)
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/db/migrations/state.py", line 411, in from_model
    fields.append((name, field.clone()))
  File "/home/user/.local/share/virtualenvs/efs-cP0vQdei/lib/python3.6/site-packages/django/db/models/fields/__init__.py", line 470, in clone
    return self.__class__(*args, **kwargs)
  File "/home/user/Documents/websites/efs/ssadventures/customfields.py", line 23, in __init__
    self.content_types = kwargs.pop('content_types')
KeyError: 'content_types'
john
  • 169
  • 12

1 Answers1

0

I figured out the solution:

Add a deconstruct to the custom field class:

def deconstruct(self):
    name, path, args, kwargs = super(MediaField, self).deconstruct()

    kwargs['content_types'] = self.content_types
    kwargs['max_upload_size'] = self.max_upload_size

    return name, path, args, kwargs
john
  • 169
  • 12