【发布时间】:2015-03-29 20:44:07
【问题描述】:
我按照教程在 Django 1.6 中使用 Haystack 和 Whoosh 创建搜索查询。搜索模板有效,但在填写和提交查询时,自动检测 url 会呈现生成 url 的 404; myapp.entry,找不到。我尝试将 ajax.js 中的 url 从 /article/search/ 到 /search/ 但它没有帮助。有什么想法吗?
在 settings.py 中
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.whoosh_backend.WhooshEngine',
'PATH': os.path.join( os.path.dirname(__file__), 'whoosh' ),
},
}
在views.py中
from haystack.query import SearchQuerySet
def search_titles(request):
#'' - defaultvalue if searchvalue (search_text) is None
articles =SearchQuerySet().autocomplete(content_auto=request.
POST.get('search_text',''))
return render(request,'ajax_search.html',{"articles":articles})
在 urls.py 中
urlpatterns = patterns('',
url(r'^search/',include('haystack.urls')),
)
在models.py中
class Entry(models.Model):
datetime = models.DateTimeField(auto_now_add = True)
title = models.CharField(max_length = 70)
content = models.TextField()
author = models.ForeignKey(User)
entry_count = models.PositiveIntegerField()
n_pingbacks = models.PositiveIntegerField()
belongsTo = models.ForeignKey(Topic)
def __unicode__(self):
return self.title
在 search_indexes.py 中
from haystack import indexes
from myapp.models import Entry
import datetime
class EntryIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True,use_template=True)
datetime = indexes.DateTimeField(model_attr='datetime')
content_audio = indexes.EdgeNgramField(model_attr='title')
# get the relevant model
def get_model(self):
return Entry
# returning results from guideline
def index_queryset(self, using=None):
"""used when the entire index for model is updated """
return self.get_model().objects.all()
在 ajax.js 中
$(function(){
$('#search').keyup(function() {
$.ajax({
type: "POST",
url: "/search/",
data: {
'search_text' : $('#search').val(),
'csrfmiddlewaretoken' : $("input[name=csrfmiddlewaretoken]").val()
},
success: searchSuccess,
dataType: 'html'
});
});
});
function searchSuccess(data, textStatus, jqXHR)
{
$('#search-results').html(data);
}
在 myapp/templates/search/indexes/myapp/entry_text.txt 中
{{ object.title }}
{{ object.body }}
在 myapp/templates/search/indexes/search.html
{% extends 'base.html' %}
{% block content %}
<h2>Search</h2>
<form method="get" action="../">
<table>
{{ form.as_table }}
<tr>
<td> </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.title }}</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 }}&page={{ page.previous_page_number }}">{% endif %}« Previous{% if page.has_previous %}</a>{% endif %}
|
{% if page.has_next %}<a href="?q={{ query }}&page={{ page.next_page_number }}">{% endif %}Next »{% if page.has_next %}</a>{% endif %}
</div>
{% endif %}
{% else %}
{# Show some example queries to run, maybe query syntax, something else? #}
{% endif %}
</form>
{% endblock %}
在 myapp/templates/ajax_search.html 中
{% if articles.count > 0 %}
{% for article in articles %}
<li><a href="{{article.object.get_absolute_url}}">{{article.object.title}}</a></li>
{% endfor %}
{% else %}
<li>No searchresults to display!</li>
{% endif %}
【问题讨论】:
标签: jquery ajax django django-haystack whoosh