Django 干草堆:如何从另一个类索引字段

drkbr07n  于 2022-12-14  发布在  Go
关注(0)|答案(3)|浏览(136)

我有一个django模型Story,我可以使用模板成功地索引它。然而,还有另一个模型Reviews,它有一个静态方法,它接受Story对象,并返回ratings作为整数。我如何在ratings上索引Story呢?

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

我尝试在模板story_text.txt中调用此方法,但结果出现错误。

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

**编辑:**我尝试在模板中使用下面的字段,在建立索引时没有给予任何错误。但现在如何在使用SearchQuerySet搜索时引用此字段

Reviews.average_start_rating( {{object}} )
zi8p0yeb

zi8p0yeb1#

我很困惑。我不认为你可以在Django的模板引擎中使用像{{评论.评分对象}}这样的语法。如果可以的话,那是我不知道的。
为什么不首先在Context中传递要在模板中显示的内容呢?
{{ object }}可能会转译,因为它在内容中有对象。例如,如果您使用UpdateView(以类别为基础的检视),它会自动在内容中包含对象。

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

你可以在你的html.html中使用{{object}},因为有了UpdateView。你可以在url conf中给予pk号,比如(?P<pk>[0-9]+)
您可以在没有UpdateView的情况下这样做

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

在窗体视图中,您可以使用

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

我的想法是在上下文中一起传递故事对象和具有故事对象的FK的评论对象。

8ehkhllq

8ehkhllq2#

我能够让它工作使用干草堆高级数据准备。高级数据准备
使用一个额外的字段,可以有一个准备方法。然而,唯一的问题是我可以使用这个字段排序数据,但不能使用它搜索。

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
qoefvg9y

qoefvg9y3#

在这里,您可以使用prepare或prepare_FOO方法,而不是使用text字段的模板:

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

    def prepare_text(self, obj):
        return "\n".join(f"{col}" for col in [obj.story_name, Reviews.ratings(obj)])

    def get_model(self):
        return Story

相关问题