2017-07-10 2 views
2

J'ai un modèle django Story que j'ai réussi à indexer en utilisant des templates. Cependant, il existe un autre modèle Reviews qui a une méthode statique qui prend l'objet Story et renvoie ratings en tant qu'entier. Comment puis-je indexer Story sur ratings également.Django Haystack: Comment indexer un champ d'une autre classe

{{ object.story_name }} 
{{Reviews.ratings(object)}} 

J'ai essayé d'appeler cette méthode dans le modèle story_text.txt, mais cela aboutit à une erreur.

django.template.exceptions.TemplateSyntaxError: Could not parse the remainder: '(object)'.... 

Edit: J'ai essayé d'utiliser ci-dessous dans le modèle, il ne donne aucune erreur lors de la construction de l'indice. Mais comment puis-je réfère maintenant à ce domaine lors de la recherche à l'aide SearchQuerySet

Reviews.average_start_rating({{object}}) 
+0

'Essayez {{objet}}' Reviews.ratings ou 'args = (objet,)' –

+0

ne fonctionne pas, à défaut avec la même erreur, 'Impossible d'analyser le remainder' – garg10may

+0

Pouvez-vous montrer votre' ratings' code? –

Répondre

0

Je suis confus. Je ne pense pas que vous pouvez utiliser une syntaxe comme {{Reviews.rating object}} avec un moteur de template dans Django. Si c'est possible, c'est ce que je ne savais pas. Pourquoi ne pas passer ce que vous voulez montrer dans le modèle dans le contexte en premier lieu?

{{object}} a pu être rendu car il a un objet dans Context. Par exemple, si vous utilisez UpdateView (vue basée sur la classe), il contient automatiquement l'objet dans le contexte.

class Example(UpdateView): 
    model = yourClass 
    form_class = yourFormClass 
    template_name = yourhtml 
    success_url = URL redirect page after success 

vous pouvez utiliser {{object}} en raison de yourhtml.html UpdateView. vous donnez le numéro de pk dans l'URL de conf comme (?P<pk>[0-9]+).

vous pouvez faire comme ça, sans UpdateView

class anotherExample(View): 
    def get(self, request, *args, **kwargs): 
     render(request, 'yourhtml.html', {"object": Class.objects.get(id=self.kwargs['pk'])}) 

en mode formulaire, vous pouvez utiliser

def get_context_data(self, **kwargs): 
    context = super().get_context_data(**kwargs) 
    context['object'] = Class.objects.get(id= ...) 
    return context 

mon idée passe objet histoire et de l'objet d'examen qui a FK l'objet d'histoire ensemble dans le contexte .

+0

Le modèle que j'utilise dans le modèle de haystack, j'ai trouvé un moyen d'ajouter le champ pour l'indexation. Va ajouter une réponse finalement. Faire des recherches. – garg10may

+0

Je vois. alors, j'ai totalement mal compris votre question. Je vais vérifier django haystack et votre réponse! – Jayground

0

J'ai été capable de le faire fonctionner en utilisant haystack advanced-data-preparation. En utilisant un champ supplémentaire on peut avoir une méthode de préparation pour cela. Cependant, seul problème est que je peux commander les données en utilisant ce champ, mais je ne peux pas chercher à l'utiliser.

class StoryIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    ratings = indexes.FloatField() 

    def prepare_ratings(self, obj): 
     return Reviews.ratings(obj) 

    def get_model(self): 
     return Story