2015-01-15 40 views
1

我在我的django(1.7)網站中使用乾草堆(2.1.1)和whoosh。我很高興,因爲它工作,但不完全。該應用程序顯示正確的搜索,但是當我點擊結果時,它不會進入產品頁面。它看起來像我沒有配置使{{result.object.get_absolute_url}}無法正常工作的東西。我希望所有的你能幫助我(作爲參考我把所有的代碼)(haystack + whoosh){{result.object.get_absolute_url}}不起作用

這是我的應用程序模型(產品/型號)

from django.db import models 

class Products(models.Model): 
    name = models.CharField(max_length=120) 
    description = models.TextField() 
    image1 = models.ImageField(upload_to='product_images', blank=True, null=True) 
    price = models.FloatField(default=0.00) 
    slug = models.CharField(max_length=50, blank=False, null=True) 
    pub_date = models.DateTimeField() 

    def __unicode__(self): 
     return str(self.name) 


    class Meta: 
     ordering =['-id'] 
     verbose_name = ('Product') 
     verbose_name_plural = ('Products') 

這是我的search_indexes.py,那我把我的應用程序相同的文件夾(產品/ search_indexes.py)

import datetime 
from haystack import indexes 
from products.models import Products 


class ProductsIndex(indexes.SearchIndex, indexes.Indexable): 
    text = indexes.CharField(document=True, use_template=True) 
    name = indexes.CharField(model_attr='name') 
    description = indexes.CharField(model_attr='description') 
    pub_date = indexes.DateTimeField(model_attr='pub_date') 

    def get_model(self): 
    return Products 

    def index_queryset(self, using=None): 

    return self.get_model().objects.filter(pub_date__lte=datetime.datetime.now()) 

我沒有在設置的更改文件

HAYSTACK_CONNECTIONS = { 
'default': { 
    'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine', 
    'PATH': os.path.join(os.path.dirname(__file__), 'whoosh_index'), 
    }, 
} 

在我的模板文件夾中創建文件「模板/搜索/索引/產品/ products_text.txt」

{{ object.name }} 
{{ object.description }} 

的HTML和URL是一樣大海撈針的網站(只是改變result.object.title爲result.object.name)。在URL中:(R '^搜索/',包括( 'haystack.urls'))和HTML(模板/搜索/ search.html)

{% extends 'base.html' %} 

{% block content %} 
    <h2>Search</h2> 

    <form method="get" action="."> 
    <table> 
     {{ form.as_table }} 
     <tr> 
      <td>&nbsp;</td> 
      <td> 
       <input type="submit" value="Search"> 
      </td> 
     </tr> 
    </table> 

    {% if query %} 
     <h3>Results</h3> 

     {% for result in page.object_list %} 
      <p> 
       <a href="{{ result.object.get_absolute_url }}">{{ result.object.name }}</a> 
      </p> 
     {% empty %} 
      <p>No results found.</p> 
     {% endfor %} 

     {% if page.has_previous or page.has_next %} 
      <div> 
       {% if page.has_previous %}<a href="?q={{ query }}&amp;page={{ page.previous_page_number }}">{% endif %}&laquo; Previous{% if page.has_previous %}</a>{% endif %} 

       {% if page.has_next %}<a href="?q={{ query }}&amp;page={{ page.next_page_number }}">{% endif %}Next &raquo;{% if page.has_next %}</a>{% endif %} 
      </div> 
     {% endif %} 
    {% else %} 
     {# Show some example queries to run, maybe query syntax, something else? #} 
    {% endif %} 
</form> 
{% endblock %} 

正如我所說的它的搜索和顯示它之前。但我不知道爲什麼{{result.object.get_absolute_url}}不起作用,所以它顯示產品標題,但沒有將它們鏈接到它們的頁面。

+0

您需要向我們展示生成該模板的'view'。上下文模板中的「對象」是什麼? – 2015-01-22 10:40:57

+0

你檢查了你的URLconf嗎?當你添加haystack的url時,也許你會忽略產品視圖的模式,像''urlpatterns = patterns(...)''而不是''urlpatterns + = patterns(...)''。注意''=''和''+ =''之間的區別。 – alxs 2015-01-26 13:06:38

+0

謝謝你們。我很固定,但方式不是很美。我刪除了** {{result.object.get_absolute_url}} **,我正在處理地址** **我確定那裏是使用get_absolute_url更好的方法,但我找不到方法。 – oskreyes 2015-01-28 02:17:03

回答

5

你只需要在模型類上顯式定義get_absolute_url方法:

class Products(models.Model): 
    ... 
    def get_absolute_url(self): 
     return "/products/%s/" % self.slug 

它甚至會更好,這種方法,這將取決於你的URLconf中使用reverse。更多詳情here

相關問題