es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

django: related_name del campo ForeignKey relacionado consigo mismo no funciona | obtener dirección opuesta de la referencia a sí mismo en la plantilla

¡Hola! 🙂

Tengo un modelo para crear instituciones individuales (Institution) y puedo conectarlo a una institución padre a través de parent_institution (self).

Entonces, tengo la institución A, que es padre de b, c, d (todas ellas instituciones individuales con su propia vista de detalles). En la vista de detalles de b, tengo la sección ‘institución padre’ donde obtengo A como resultado, incluyendo un enlace a la vista de detalles de A.


<p><b>Institución padre: </b>
{% if institution.parent_institution %}
<a href="{% url 'stakeholders:institution_detail' institution.parent_institution.id %}">
{{institution.parent_institution}}
</a>
{% endif %}
</p>

Siguiendo este enlace llego a la vista de detalles de A donde quiero una sección con las instituciones hijas. Deberían aparecer b, c, d.

He añadido un nombre relacionado a la parent_institution.


class Institution(models.Model):
name = models.CharField(
verbose_name=("Nombre de la institución"),
max_length=200,
)
parent_institution = models.ForeignKey(
"self",
verbose_name=
("Institución padre"),
on_delete=models.SET_NULL,
blank=True,
null=True,
help_text=_("si corresponde"),
related_name="child",
)

Normalmente puedo seguir la clave externa en la dirección opuesta a través de este nombre relacionado.


<p><b>Institución hija: </b>
{{institution.child.name}}
</p>

Pero en este caso no está funcionando y me da ‘None’. Por lo tanto, intenté lo siguiente:


{% if institution.id == institution.all.parent_institution.id %}
{{institution.name}}
{% endif %}


{% if institution.all.id == institution.parent_institution.id %}
{{institution.name}}
{% endif %}


{% for child in institutions.all %}
{% if child.id == institution.parent_institution.id %}
{{institution.name}}
{% endif %}
{% endfor %}

En views.py:

class InstitutionDetail (DetailView):
model = Institution

def get(self, request, *args, **kwargs):
institutions_child = Institution.objects.filter(parent_institution__isnull=True).prefetch_related ('parent_institution_set')
institutions = get_object_or_404(Institution, pk=kwargs['pk'])

context = {&#39;institutions_child&#39;: institutions_child, &#39;institutions&#39;: institutions}

return render(request, &#39;stakeholders/institution_detail.html&#39;, context)


{% for child_node in institutions.parent_institution_set.all %}
{{child_node.name}}
{% endfor %}

En cualquier caso, obtengo ‘None’ o el nombre de las instituciones actuales (A).

¿Alguien sabe cómo podría lograr el objetivo de obtener todas las instituciones hijas en la vista de detalles?

¡Cualquier ayuda es apreciada! 🙂

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todas las instituciones hijas en la vista detallada de la institución principal, puede utilizar el nombre relacionado que agregó al campo parent_institution en el modelo Institution.

    En su plantilla de vista detallada para la institución principal, puede recorrer el atributo parent_institution_set del objeto de institución actual para obtener todas las instituciones hijas:

    {% for child in institution.parent_institution_set.all %}
        {{ child.name }}
    {% endfor %}
    

    Asegúrese de utilizar institution.parent_institution_set.all en lugar de institutions.parent_institution_set.all porque institution es el nombre de variable que pasó al contexto de la plantilla, no institutions.

Comments are closed.