将 kwargs 传递给 Django 中的自定义字段
Passing kwargs to a custom field in django
我使用这个问题作为创建自定义字段的基础:
Django File upload size limit
当我尝试进行迁移时,我收到一条错误消息,指出 'content_types' 不在 kwargs 中。我调试了代码,我的自定义字段 init 似乎被调用了两次。一次来自我有这个字段(带有 kwargs)的模型,一次没有包含 kwargs。
我引用了这个 post:
但是我已经按照解决方案所说的去做了。
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)
模型中作用的字段:
media = MediaField(upload_to='media', # this will create a folder in MEDIA_ROOT
content_types=['jpeg', 'jpg', 'png'],
max_upload_size=5242880)
错误:KeyError: 'content_types'
堆栈跟踪:
(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'
我找到了解决方案:
对自定义字段添加解构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
我使用这个问题作为创建自定义字段的基础:
Django File upload size limit
当我尝试进行迁移时,我收到一条错误消息,指出 'content_types' 不在 kwargs 中。我调试了代码,我的自定义字段 init 似乎被调用了两次。一次来自我有这个字段(带有 kwargs)的模型,一次没有包含 kwargs。
我引用了这个 post:
但是我已经按照解决方案所说的去做了。
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)
模型中作用的字段:
media = MediaField(upload_to='media', # this will create a folder in MEDIA_ROOT
content_types=['jpeg', 'jpg', 'png'],
max_upload_size=5242880)
错误:KeyError: 'content_types'
堆栈跟踪:
(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'
我找到了解决方案:
对自定义字段添加解构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