Вместо того, чтобы повторять похожий код в каждом модуле администратора, где я хочу заменить содержимое поля гиперссылкой на страницу изменения сведений об объекте, я пытаюсь сделать для этого функцию, которую я могу вызывать из разных административные классы.
def url_to_object(obj):
url = reverse('admin:%s_%s_change' % (obj._meta.app_label, obj._meta.model_name), args=[obj.pk] )
return format_html('<a href="%s">%s</a>' % (url, obj.__str__()))
def display_link(admin_instance, obj, field_name):
"""
Replaces the object in the admin instance with a hyperlink to this object detail
defines in addition the new field with the original field name,
and enables sorting based on the original field
"""
# print(getattr(obj, field_name))
instance = url_to_object(getattr(obj, field_name))
instance.short_description = field_name
admin_instance.exclude = [field_name,] # prevent field to be displayed
instance.admin_order_field = field_name #'base_target_shape'
return instance
Вызов функции из класса ModelAdmin:
def _base_target_shape(self,obj):
return display_link(self,obj, 'base_target_shape')
# _base_target_shape.short_description = 'base_target_shape'
# exclude=['base_target_shape',] # prevent field to be displayed
# _base_target_shape.admin_order_field ='base_target_shape'
Я могу создать ссылку, но инструкции exclude и admin_order_field не передаются обратно административный класс. Цель состоит в том, чтобы не повторять всегда одно и то же short_description, exclude и admin_order_field во всех административных классах
Заранее спасибо