Me gustaría agregar un hipervínculo al modelo relacionado Training
Sería bueno tener una solución declarativa, ya que quiero usar esto en varios lugares.
El icono de "lápiz" abre el modelo relacionado en una ventana emergente. Eso no es lo que quiero. Quiero un hipervínculo simple al modelo relacionado.
Por cierto, si usa "raw_id_fields", entonces el resultado es exactamente lo que estaba buscando: hay un hipervínculo a la interfaz de administración correspondiente de este ForeignKey.
La clase llamada RelatedFieldWidgetWrapper muestra los íconos en la página de administración de Django y, por lo tanto, debe anularlos. Por lo tanto, cree una clase personalizada como se muestra a continuación,
from django.contrib.admin.widgets import RelatedFieldWidgetWrapper class CustomRelatedFieldWidgetWrapper(RelatedFieldWidgetWrapper): template_name = 'admin/widgets/custom_related_widget_wrapper.html' @classmethod def create_from_root(cls, root_widget: RelatedFieldWidgetWrapper): # You don't need this method of you are using the MonkeyPatch method set_attr_fields = [ "widget", "rel", "admin_site", "can_add_related", "can_change_related", "can_delete_related", "can_view_related" ] init_args = {field: getattr(root_widget, field) for field in set_attr_fields} return CustomRelatedFieldWidgetWrapper(**init_args) def get_context(self, name, value, attrs): context = super().get_context(name, value, attrs) rel_opts = self.rel.model._meta info = (rel_opts.app_label, rel_opts.model_name) context['list_related_url'] = self.get_related_url(info, 'changelist') return context Mira, la variable de contexto list_related_url es la ruta relativa que necesitamos aquí. Ahora, cree un archivo HTML para representar la salida,
#File: any_registered_appname/templates/admin/widgets/custom_related_widget_wrapper.html {% extends "admin/widgets/related_widget_wrapper.html" %} {% block links %} {{ block.super }} <a href="{{list_related_url}}">- Link To Related Model -</a> {% endblock %} # admin.py # other imports from ..widgets import CustomRelatedFieldWidgetWrapper from django.contrib.admin import widgets widgets.RelatedFieldWidgetWrapper = CustomRelatedFieldWidgetWrapper # monket patch # admin.py class AlbumAdmin(admin.ModelAdmin): hyperlink_fields = ["related_field_1"] def formfield_for_dbfield(self, db_field, request, **kwargs): formfield = super().formfield_for_dbfield(db_field, request, **kwargs) if db_field.name in self.hyperlink_fields: formfield.widget = CustomRelatedFieldWidgetWrapper.create_from_root( formfield.widget ) return formfieldHay varias formas de ir. Aqui hay uno.
Agregue algo de javascript que cambie el comportamiento del enlace existente. Agregue la siguiente secuencia de comandos al final de la plantilla de administración anulada admin admin/widgets/related_widget_wrapper.html . Elimina la clase que activa el modal y cambia el enlace al objeto.
Solo se activará para el campo id_company . Cambie a sus necesidades.
{% block javascript %} <script> 'use strict'; { const $ = django.jQuery; function changeEditButton() { const edit_btn = document.getElementById('change_id_company'); const value = edit_btn.previousElementSibling.value; const split_link_template = edit_btn.getAttribute('data-href-template').split('?'); edit_btn.classList.remove('related-widget-wrapper-link'); edit_btn.setAttribute('href', split_link_template[0].replace('__fk__', value)); }; $(document).ready(function() { changeEditButton(); $('body').on('change', '#id_company', function(e) { changeEditButton(); }); }); } </script> {% endblock %}Este código también se puede modificar para que se active para todos los botones de edición y no solo para el botón de edición de la empresa.