forked from rc/aircox
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
class UnrelatedInlineMixin:
|
|
"""Inline class that can be included in an admin change view whose model is
|
|
not directly related to inline's model."""
|
|
|
|
view_model = None
|
|
parent_model = None
|
|
parent_fk = ""
|
|
|
|
def __init__(self, parent_model, admin_site):
|
|
self.view_model = parent_model
|
|
super().__init__(self.parent_model, admin_site)
|
|
|
|
def get_parent(self, view_obj):
|
|
"""Get formset's instance from `obj` of AdminSite's change form."""
|
|
field = self.parent_model._meta.get_field(self.parent_fk).remote_field
|
|
return getattr(view_obj, field.name, None)
|
|
|
|
def save_parent(self, parent, view_obj):
|
|
"""Save formset's instance."""
|
|
setattr(parent, self.parent_fk, view_obj)
|
|
parent.save()
|
|
return parent
|
|
|
|
def get_formset(self, request, obj):
|
|
ParentFormSet = super().get_formset(request, obj)
|
|
inline = self
|
|
|
|
class FormSet(ParentFormSet):
|
|
view_obj = None
|
|
|
|
def __init__(self, *args, instance=None, **kwargs):
|
|
self.view_obj = instance
|
|
instance = inline.get_parent(instance)
|
|
self.instance = instance
|
|
super().__init__(*args, instance=instance, **kwargs)
|
|
|
|
def save(self):
|
|
inline.save_parent(self.instance, self.view_obj)
|
|
return super().save()
|
|
|
|
return FormSet
|