我正在使用模板来创建将被编入索引的文档,我的模板看起来像是:
{{object.generic_data}}
现在,我希望我的generic_data由prepare_generic_data函数生成。这样做似乎无法正常工作,因为在准备功能可以返回之前,数据正被送到模板。
所以,我想知道是否有一些方法让我在准备功能旁边使用模板或另一种方法来解决这个问题。
另外,如果问题不够明确,请告诉我。 编辑:
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"
型号:
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)
答案 0 :(得分:0)
在索引模板的上下文中,object
是模型实例(一个Post
对象),而不是PostIndex
对象。因此object
没有generic_data
属性。您无法从模板内部访问其他索引字段。
最简单的解决方案是将generic_data
的逻辑移到Post
模型中,如下所示:
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"
然后模板中的现有代码将起作用:
{{ object.generic_data }}