如果 haystack returns 一个对象,为什么我不能使用 result.objects.get_absolute_url
If haystack returns an object, why can't I use result.objects.get_absolute_url
我正在使用 haystack 并按照教程进行操作。我将 haystack 添加到设置,迁移,然后我创建这个
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
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()
在我创建的模板中
search/indexes/blog/post_text.txt
并将其添加到其中
{{ object.title }}
{{ object.tags.all|join:", " }}
{{ object.body }}
在我的 views.py 中添加
from haystack.query import SearchQuerySet
然后在一个视图函数中
def post_search(request):
form = request.GET.get('q')
results = SearchQuerySet().models(Post).filter(content=form)
# count total results
total_results = results.count()
template = 'blog/post/search.html',
context = {
'form': form,
'results': results,
'total_results': total_results
}
return render(request, template, context)
并在搜索模板中
{% for result in results %}
<p>{{result.publish}}</p>
<a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a>
但唯一返回的是发布。如果我检查 a 元素,则 href 为空白。如果我这样做
{{results}}
我得到了这样的东西
[blog.post.pk(2)] or something like that
这些都行不通
{{result.object.publish}}<br>
但这会
{{result.publish}}
并访问这些
{{result.object.body}}<br>
{{result.object.title}}<br>
{{result.object.slug}}<br>
我回去补充这个
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
# added this
title = indexes.CharField(model_attr='title')
body = indexes.CharField(model_attr='body')
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()
这与教程所说的完全不同我做错了什么?
我这样做得到了我的结果
result.title
没有
result.object.title
从我观看和阅读的教程中,他们所做的就是这个
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
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()
但可以像这样访问所有内容
result.object.title
result.object.publish
result.object.get_absolute_url
他们显然正在访问整个对象,但出于某种原因我没有。对我可能会看到的东西(如视频)的任何指导或建议
将不胜感激。我真的不明白为什么我不访问整个对象。
编辑:
我的models.py
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250,
unique_for_date='publish')
image = models.ImageField(null=True, blank=True)
author = models.ForeignKey(User,
related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10,
choices=STATUS_CHOICES,
default='draft')
video = models.BooleanField(default=False)
video_path = models.CharField(max_length=320,
null=True,
blank=True,)
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.publish.year,
self.publish.strftime('%m'),
self.publish.strftime('%d'),
self.slug])
objects = models.Manager() # The default manager.
published = PublishedManager() # Our custom manager.
tags = TaggableManager()
我正在使用
Django==1.9.4
django-crispy-forms==1.6.0
django-haystack==2.4.1
django-taggit==0.18.0
Pillow==3.1.1
pysolr==3.4.0
pytz==2016.1
requests==2.9.1
python 3.5
我已经更新并重建了我的架构,我跟随 Mike Hibbert 并阅读了一本名为 django 的书,逐字逐句地跟随他们,但仍然无法弄清楚。这是 kinf=d 的错误吗?
经过大约 3 天的研究,我发现了 django 1.9 没有得到完全支持的信息,所以这可能是问题所在。希望这能让别人摆脱我所经历的痛苦。
我遇到了类似甚至可能相同的问题。
出于某种原因,在我访问包含结果的 HaystackSearchQueryset 后,我的 get_absolute_url 方法中的反向查找失败了。似乎反向机制没有任何模式可供分析(“...尝试的模式:[]”)。
你关于 Django 1.9 不兼容性的建议对我帮助很大,因为我刚刚安装了 Claude Peroz 的 lastest master and everything seems to work just fine now.Django 1.9 compatibility was added here。耶:-)
我正在使用 haystack 并按照教程进行操作。我将 haystack 添加到设置,迁移,然后我创建这个
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
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()
在我创建的模板中
search/indexes/blog/post_text.txt
并将其添加到其中
{{ object.title }}
{{ object.tags.all|join:", " }}
{{ object.body }}
在我的 views.py 中添加
from haystack.query import SearchQuerySet
然后在一个视图函数中
def post_search(request):
form = request.GET.get('q')
results = SearchQuerySet().models(Post).filter(content=form)
# count total results
total_results = results.count()
template = 'blog/post/search.html',
context = {
'form': form,
'results': results,
'total_results': total_results
}
return render(request, template, context)
并在搜索模板中
{% for result in results %}
<p>{{result.publish}}</p>
<a href="{{ result.object.get_absolute_url }}">{{ result.object.title }}</a>
但唯一返回的是发布。如果我检查 a 元素,则 href 为空白。如果我这样做
{{results}}
我得到了这样的东西
[blog.post.pk(2)] or something like that
这些都行不通
{{result.object.publish}}<br>
但这会
{{result.publish}}
并访问这些
{{result.object.body}}<br>
{{result.object.title}}<br>
{{result.object.slug}}<br>
我回去补充这个
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
# added this
title = indexes.CharField(model_attr='title')
body = indexes.CharField(model_attr='body')
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()
这与教程所说的完全不同我做错了什么?
我这样做得到了我的结果
result.title
没有
result.object.title
从我观看和阅读的教程中,他们所做的就是这个
class PostIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
publish = indexes.DateTimeField(model_attr='publish')
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()
但可以像这样访问所有内容
result.object.title
result.object.publish
result.object.get_absolute_url
他们显然正在访问整个对象,但出于某种原因我没有。对我可能会看到的东西(如视频)的任何指导或建议 将不胜感激。我真的不明白为什么我不访问整个对象。
编辑:
我的models.py
class Post(models.Model):
STATUS_CHOICES = (
('draft', 'Draft'),
('published', 'Published'),
)
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250,
unique_for_date='publish')
image = models.ImageField(null=True, blank=True)
author = models.ForeignKey(User,
related_name='blog_posts')
body = models.TextField()
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10,
choices=STATUS_CHOICES,
default='draft')
video = models.BooleanField(default=False)
video_path = models.CharField(max_length=320,
null=True,
blank=True,)
class Meta:
ordering = ('-publish',)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('blog:post_detail',
args=[self.publish.year,
self.publish.strftime('%m'),
self.publish.strftime('%d'),
self.slug])
objects = models.Manager() # The default manager.
published = PublishedManager() # Our custom manager.
tags = TaggableManager()
我正在使用
Django==1.9.4
django-crispy-forms==1.6.0
django-haystack==2.4.1
django-taggit==0.18.0
Pillow==3.1.1
pysolr==3.4.0
pytz==2016.1
requests==2.9.1
python 3.5
我已经更新并重建了我的架构,我跟随 Mike Hibbert 并阅读了一本名为 django 的书,逐字逐句地跟随他们,但仍然无法弄清楚。这是 kinf=d 的错误吗?
经过大约 3 天的研究,我发现了 django 1.9 没有得到完全支持的信息,所以这可能是问题所在。希望这能让别人摆脱我所经历的痛苦。
我遇到了类似甚至可能相同的问题。
出于某种原因,在我访问包含结果的 HaystackSearchQueryset 后,我的 get_absolute_url 方法中的反向查找失败了。似乎反向机制没有任何模式可供分析(“...尝试的模式:[]”)。
你关于 Django 1.9 不兼容性的建议对我帮助很大,因为我刚刚安装了 Claude Peroz 的 lastest master and everything seems to work just fine now.Django 1.9 compatibility was added here。耶:-)