Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

893
Views
Administrador de Django: Agregar hipervínculo al modelo relacionado

Me gustaría agregar un hipervínculo al modelo relacionado Training

Django-admin-add-hyperlink-to-related-model

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.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

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 %}

¿Como conectar?

Método-1: parche de mono

 # admin.py # other imports from ..widgets import CustomRelatedFieldWidgetWrapper from django.contrib.admin import widgets widgets.RelatedFieldWidgetWrapper = CustomRelatedFieldWidgetWrapper # monket patch

Método 2: Anular ModelAdmin

 # 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 formfield

Resultado

Captura de pantalla del resultado

over 4 years ago · Santiago Trujillo Report

0

Hay 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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!