2011-06-10 19 views
9

que tienen modelos de este tipoDjango consulta inversa en la plantilla

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 

Quiero que todos los blogs en una página. He escrito una vista de tal manera que

def listAllBlogs(request): 
    blogs= Blog.objects.all() 
    return object_list(
     request, 
     blogs, 
     template_object_name = "blog", 
     allow_empty = True, 
     ) 

Y puedo mostrar lema del blog de tal manera que a la vista

{% extends "base.html" %} 
{% block title %}{% endblock %} 
{% block extrahead %} 

{% endblock %} 

{% block content %} 
    {% for blog in blog_list %} 
      {{ blog.tagline }} 
    {% endfor %} 
{% endblock %} 

Pero me gustaría mostrar, tal cosa blog__entry__name pero no sé cómo puedo Lo logro en plantilla Además, no puede haber entrada en un blog. ¿Cómo puedo detectar en la plantilla?

Gracias

+2

Ambas respuestas a continuación son correctas, solo dos observaciones. Defina 'related_name = 'entries'' para el campo' blog', y podrá escribir 'blog.entries'. Y use 'select_related()', no para hacer consultas SQL N + 1. – DrTyrsa

Respuesta

18

Para acceder a las entradas de blog (Related Manager): blog.entry_set.all

Para realizar otras acciones si el blog no tienen entradas, tiene la etiqueta {% empty %} que se ejecuta cuando el conjunto está vacío.

{% block content %} 
    {% for blog in blog_list %} 
      {{ blog.tagline }} 
      {% for entry in blog.entry_set.all %} 
       {{entry.name}} 
      {% empty %} 
      <!-- no entries --> 
      {% endfor %} 
    {% endfor %} 
{% endblock %} 
+0

@brsbilgic [nombre_relacionado] (https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.nombre_relacionado) – DrTyrsa

+0

Para un 'OneToOneField' puede simplemente usar:' blog.entry' (en lugar de 'blog.entry_set'). https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationships – manji

+0

Eso funciona muy bien. ¡Gracias! Pero, ¿y si la relación fuera uno a uno blog = models.OneToOneField (Blog, unique = True). ¿Cuál es la forma correcta de hacerlo en una plantilla como '{{blog.entry__headline}}' – brsbilgic

7

según su código podría hacer lo siguiente.

{% block content %} 
    {% for blog in blog_list %} 
      {{ blog.tagline }} 
      {% for entry in blog.entry_set.all %} 
       {{entry.name}} 
      {% endfor %} 
    {% endfor %} 
{% endblock %} 
+0

¿No debería ser blog.entry_set en lugar de blog_entry_set? – bcoughlan

+0

@waitinforatrain oops, sí, ¡gracias debería haberlo sido! – JamesO

Cuestiones relacionadas