2016-08-10 1 views
0

I Vorlagen sind mit dem Dokument zu erstellen, die indiziert werden, meine Vorlage aussieht, sagen:Django Heuhaufen: Hinzufügen von Daten aus prepared_field_name zur Indexing Vorlage

{{object.generic_data}} 

Nun, ich meine generic_data erstellt werden sollen durch eine prepare_generic_data-Funktion. Dies scheint nicht zu funktionieren, da die Daten der Vorlage zugeführt werden, bevor die Vorbereitungsfunktion es zurückgeben kann.

Also wollte ich wissen, ob es eine Möglichkeit für mich gibt, die Vorlage neben der Prepare-Funktion oder eine andere Möglichkeit, um dieses Problem zu umgehen.

Bitte lassen Sie mich auch wissen, wenn die Frage nicht klar genug ist. Edit:

search_index

import datetime 
from haystack import indexes 
from diskus.models import Recipe,Post 


class PostIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.EdgeNgramField(document=True, use_template=True) 
    post_id=indexes.IntegerField(model_attr='user_entity_id_id') 
    content_key=indexes.IntegerField(model_attr='content_key') 
    content_type=indexes.IntegerField(model_attr='content_type') 
    generic_data=indexes.CharField() 
    slug=indexes.CharField(model_attr='slug') 

    def get_model(self): 
     return Post 

    def index_queryset(self, using=None): 
     """Used when the entire index for model is updated.""" 
     return self.get_model().objects.all() 

    def prepare_generic_data(self,obj): 
     if obj.content_type==3: 
      recipe=Recipe.objects.get(pk=obj.content_key) 
      return recipe.name 
     else: 
      return "random_stuff" 

Modell:

class Post(UserEntity): 
    user_entity_id = models.OneToOneField(UserEntity, 
           on_delete=models.CASCADE, 
           related_name='post', 
           primary_key=True, 
           db_column='id') 
    content_key = models.IntegerField() 
    content_type = models.IntegerField() 

class Recipe(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=100) 
+1

Können Sie erklären, was Sie‘ re versuchen zu erreichen? Wenn Sie eine Vorlage haben, mit der Sie beliebigen Inhalt generieren können, warum benötigen Sie auch eine Vorbereitungsfunktion? – solarissmoke

+0

@solarissmoke im prepare_generic_data Ich erhalte Daten von einem anderen Modell (mit model.objects.get (pk = content_key)) und content_key ist definiert als content_key = indexes.IntegerField (model_attr = 'content_key'), –

+0

Kannst du all deine Posts posten? Code als Bearbeitung der Frage? Veröffentlichen Sie auch die Modell- und Indexklasse. – solarissmoke

Antwort

0

Im Rahmen einer Indizierung Vorlage object ist die Modellinstanz (a Post Objekt), kein PostIndex Objekt. So hat object keine generic_data Eigenschaft. Sie können nicht auf andere Indexfelder innerhalb der Vorlage zugreifen.

Die einfachste Lösung ist die Logik für generic_data in das Post Modell zu bewegen, etwa so:

class Post(UserEntity): 

    def generic_data(self): 
     if self.content_type == 3: 
      # NOTE: you may need to ensure the Recipe is defined 
      # before Post in the models.py file, or you will get a name 
      # resolution error. 
      recipe = Recipe.objects.get(pk=self.content_key) 
      return recipe.name 
     else: 
      return "random_stuff" 

Dann wird der vorhandene Code in Ihrer Vorlage funktioniert:

{{ object.generic_data }} 
Verwandte Themen