如果haystack返回一个对象,为什么我不能使用result.objects.get_absolute_url

时间:2016-03-20 17:47:51

标签: django python-3.x solr django-haystack

我正在使用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
他们显然是在访问整个对象,但由于某些原因,我不是。对我可能会看到的视频的任何指导或建议 不胜感激。我真的不知道为什么我没有访问整个对象。

编辑:

my 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

我已经更新并重建了我的架构,我跟着迈克希伯特读了一本名为django的书,通过例子将它们逐字逐句地读出来,但仍然无法弄明白。这是一些kinf = d的bug吗?

2 个答案:

答案 0 :(得分:0)

在研究了这个约3天之后,我发现django 1.9并未得到完全支持的信息,所以这可能是希望的问题。希望这可以使某人免于我所经历的痛苦。

答案 1 :(得分:0)

我有类似甚至可能是同样的问题。

出于某种原因,在我访问包含结果的HaystackSearchQueryset之后,我的get_absolute_url方法中的反向查找失败了。似乎反向机制没有任何模式可供分析(&#34; ......模式尝试:[]&#34;)。

你指向Django 1.9不兼容的建议帮助了我很多,因为我刚刚安装了lastest master,现在一切似乎都运行良好.Django 1.9兼容性由Claude Peroz添加here。耶: - )