2010-10-22 11 views
6

Si tengo un MultiValueField en uno de mis índices de búsqueda, y quiero mostrar cada valor en los resultados de búsqueda, ¿cómo lo haría? Parece que algo no está siendo formateado adecuadamente o de alguna manera estoy entendiendo mal el MultiValueField?Iteración de elementos en una vista de resultados de búsqueda con Django haystack MultiValueField

class PageAttachmentIndex(indexes.SearchIndex): 
    # This should reference search/indexes/pages/pageattachment_text.txt 
    text  = indexes.CharField(document=True, use_template=True) 
    title  = indexes.CharField(model_attr='name') 
    page  = indexes.IntegerField(model_attr='page_id') 
    attrs  = indexes.MultiValueField() 
    file  = indexes.CharField(model_attr='file') 
    filesize = indexes.IntegerField(model_attr='file__size') 
    timestamp = indexes.DateTimeField(model_attr='timestamp') 
    url  = indexes.CharField(model_attr='page') 

    def prepare_attrs(self, obj): 
     """ Prepare the attributes for any file attachments on the 
      current page as specified in the M2M relationship. """ 
     # Add in attributes (assuming there's a M2M relationship to 
     # attachment attributes on the model.) Note that this will NOT 
     # get picked up by the automatic schema tools provided by haystack 
     attributes = obj.attributes.all() 
     return attributes 

En el aprovechamiento de esta plantilla en mi opinión:

{% if result.attrs|length %} 
    <div class="attributes"> 
     <ul> 
     {% for a in result.attrs %} 
      <li class="{% cycle "clear" "" "" %}"><span class="name">{{ a.name }}</span>: <span class="value">{{ a.value }}</span></li> 
     {% endfor %} 
     </ul> 
     <div class="clear"></div> 
    </div> 
    {% endif %} 

Esto parece volver nada para mí :(

Respuesta

1

El problema real es que el campo M2M no está indexado en SearchEngine Usted. debería devolver objetos primitivos (lista, cadena, int, etc.) en la función prepare_ y no en instancias de Django Moldel.

por ej.


def prepare_attr(self, obj): 
    return [str(v) for v in obj.attrs.all()] 
Cuestiones relacionadas