En una plantilla de Django, obtengo el comentario más reciente usando:

{{ blog.comments.all|dictsort:"created_at"|last }}

Donde blog es una instancia del modelo Blog, comments es el related_name con un ForeignKey al modelo Comment.

Este es el equivalente de

blog.comments.all().order_by("created_at").last()

Pregunta: ¿Cómo puedo obtener el campo text para el comentario en la plantilla?

En la vista, puedo hacer esto usando:

blog.comments.all().order_by("created_at").last().text

Si lo intento:

{{ blog.comments.all|dictsort:"created_at"|last.text }}

Me densito:

No se pudo analizar el resto: '.text' TemplateSyntaxError

1
Jedi 11 ago. 2016 a las 20:23

2 respuestas

La mejor respuesta
  • Etiqueta with:

    {% with newest_comment=blog.comments.all|dictsort:"created_at"|last %}
        {{ newest_comment.text }}
    {% endwith %}
    
  • Decorador cached_property:

    models.py

    from django.utils.functional import cached_property
    
    class Blog(models.Model):
        @cached_property
        def newest_comment(self):
            return self.comments.order_by('created_at').last()
    

    template.html

    {{ blog.newest_comment.text }}
    
  • contexto:

    context['newest_comment'] = blog.comments.order_by('created_at').last()
    return render(request, template, context)
    
  • Método latest():

    models.py

    class Comment(models.Model):
        class Meta:
            get_latest_by = 'created_at'
    

    template.html

    {{ blog.comments.latest.text }}
    
2
v.s.danilov 11 ago. 2016 a las 20:39

Una forma sería usar "con":

{% with blog.comments.all|dictsort:"created_at"|last as lastcomment %}
  {{ lastcomment.text }}
{% endwith %}
2
user4426017 11 ago. 2016 a las 18:15