我想在handle
方法中向CreateImageForm
的属性添加更多数据。因此,当它创建图像时,它有一个自定义属性abc
。
更改后的代码可能像这个
def handle(self, request, data):
# Glance does not really do anything with container_format at the
# moment. It requires it is set to the same disk_format for the three
# Amazon image types, otherwise it just treats them as 'bare.' As such
# we will just set that to be that here instead of bothering the user
# with asking them for information we can already determine.
if data['disk_format'] in ('ami', 'aki', 'ari',):
container_format = data['disk_format']
else:
container_format = 'bare'
meta = {'is_public': data['is_public'],
'protected': data['protected'],
'disk_format': data['disk_format'],
'container_format': container_format,
'min_disk': (data['minimum_disk'] or 0),
'min_ram': (data['minimum_ram'] or 0),
'name': data['name'],
'properties': {}}
if data['description']:
meta['properties']['description'] = data['description']
if data['architecture']:
meta['properties']['architecture'] = data['architecture']
###################################
# My changes
###################################
meta['properties']['abc'] = 'def'
if (settings.HORIZON_IMAGES_ALLOW_UPLOAD and
policy.check((("image", "upload_image"),), request) and
data.get('image_file', None)):
meta['data'] = self.files['image_file']
else:
meta['copy_from'] = data['copy_from']
try:
image = api.glance.image_create(request, **meta)
messages.success(request,
_('Your image %s has been queued for creation.') %
data['name'])
return image
except Exception:
exceptions.handle(request, _('Unable to create new image.'))
我想在不更改现有代码的情况下完成这项工作,比如重写或继承类。
没有覆盖方式而不接触任何代码。
来自horizon/forms/views.py
中的ModalFormView
您可以看到form_valid
方法使用form.handle(...)
。
因此,这个handle
方法在Horizon中是硬编码的。
至少,您必须触摸一个位置才能覆盖handle
,而无需直接修改CreateImageForm
:
# openstack_dashboard/dashboards/project/images/images/forms.py
class YourCreateImageForm(CreateImageForm): # <== Create your form inherited from CreateImageForm!
def handle(self, request, data):
...
(the whole your logic here)
...
# openstack_dashboard/dashboards/project/images/images/views.py
class CreateView(forms.ModalFormView):
form_class = project_forms.YourCreateImageForm # <== touch here!
...
也许你想覆盖它,因为你害怕将来升级地平线时发生冲突。
如果你想自定义地平线,并且不碰任何东西,最好的方法是:
- 创建您的dashborad(选项卡)
- 添加您的面板。在你的面板中,你可以很容易地从Project/Admin继承任何你想要的类,并更改你想要的部分。添加逻辑,添加表单元素,添加任何东西
最后,在您的情况下,您只想在代码中添加一行,为什么不直接添加呢?如果你升级你的地平线,我不认为这部分会引起冲突。
您可以使用HORIZON_CONFIG中的customization_module添加任何需要的覆盖。只需将路径添加到包含覆盖的文件中,如下所示:
HORIZON_CONFIG = {
'customization_module': 'some_path.overrides',
}
在您创建的overrides.py文件中,您可以添加一个monkey补丁来用您的新类覆盖现有类:
class YourCreateImageForm(CreateImageForm):
...
form_class = project_forms.YourCreateImageForm
这基本上与上面注释中提到的想法相同,但您可以避免使用customization_module接触上游代码。