Как правильно вызывать __init__ в рабочих процессах Horizon. Действие
В моем собственном рабочем процессе у меня есть действие, которое, помимо прочего, должно предоставлять пользователю список доступных изображений и разновидностей OpenStack. Я предполагаю, что лучшее место для заполнения этих двух списков находится в пределах __init__
метод. В настоящее время моя выглядит так:
class SetWorkflowInfoAction(workflows.Action):
name = forms.CharField(max_length="255", label=_("Workload Name"))
description = forms.CharField(widget=forms.Textarea,
label=_("Description"), required=False)
image_choices = []
images = forms.ChoiceField(label=_("Images"), choices=image_choices)
flavor_choices = []
flavors = forms.ChoiceField(label=_("Flavors"), choices=flavor_choices)
def __init__(self, request, image_choices=image_choices, flavor_choices=flavor_choices,
*args, **kwargs):
super(SetWorkflowInfoAction, self).__init__(request, *args, **kwargs)
image_choices = []
flavor_choices = []
images, self._more, self._prev = api.glance.image_list_detailed(
self.request)
flavors = api.nova.flavor_list(request, True)
for image in images:
image_choices.append((image.id, image.name))
if len(image_choices) > 1:
image_choices.insert(0, ('', _("Select an Image")))
self.fields['images'].choices = image_choices
for flavor in flavors:
flavor_choices.append((flavor.id, flavor.name))
if len(flavor_choices) > 1:
flavor_choices.insert(0, ('', _("Select an Flavor")))
self.fields['flavors'].choices = flavor_choices
class Meta:
name = _("Basic Workload Information")
help_text = _("")
slug = "set_workflow_info"
Беда в том, что когда я дохожу до точки вызова __init__
Я получаю эту ошибку:
File "/home/eugene/dev/horizon/openstack_dashboard/dashboards/mydashboard/workloads_panel/workflows.py", line 20, in __init__
super(SetWorkflowInfoAction, self).__init__(request, *args, **kwargs)
TypeError: __init__() takes at least 3 arguments (2 given)
Как правильно называть __init__
таким образом, чтобы я мог заполнить свои списки изображений и вкусов?
1 ответ
Все, что мне нужно было сделать, чтобы это работало, это убрать два неиспользованных аргумента из ini верхнего уровня.
Итак, рабочая версия выглядит так:
class SetWorkflowInfoAction(workflows.Action):
name = forms.CharField(max_length="255", label=_("Workload Name"))
description = forms.CharField(widget=forms.Textarea,
label=_("Description"), required=False)
image_choices = []
images = forms.ChoiceField(label=_("Images"), choices=image_choices)
flavor_choices = []
flavors = forms.ChoiceField(label=_("Flavors"), choices=flavor_choices)
def __init__(self, request,
*args, **kwargs):
super(SetWorkflowInfoAction, self).__init__(request, *args, **kwargs)
image_choices = []
flavor_choices = []
images, self._more, self._prev = api.glance.image_list_detailed(
self.request)
flavors = api.nova.flavor_list(request, True)
for image in images:
image_choices.append((image.id, image.name))
if len(image_choices) > 1:
image_choices.insert(0, ('', _("Select an Image")))
self.fields['images'].choices = image_choices
for flavor in flavors:
flavor_choices.append((flavor.id, flavor.name))
if len(flavor_choices) > 1:
flavor_choices.insert(0, ('', _("Select an Flavor")))
self.fields['flavors'].choices = flavor_choices
class Meta:
name = _("Basic Workload Information")
help_text = _("")
slug = "set_workflow_info"