自定义输入字段和自定义searchqueryset

时间:2013-10-20 04:48:23

标签: django django-haystack whoosh

我按照入门文档进行操作,并且每项工作都很顺利! :)

但是我想用自定义表单替换/search/search.html中的表单而没有可选择的模型复选框。

在表单中,我想添加一个点击按钮,按标准订购搜索结果 我的问题是:

我需要创建或修改哪些文件来执行这些文件以及它们的作用是什么?

我的代码是:

search_indexes.py

from haystack import indexes
from models import ProduitCommerce

class ProduitIndex(indexes.SearchIndex, indexes.Indexable):

    text = indexes.CharField(document=True, use_template=True)
    commerce = indexes.CharField(model_attr = 'nom_commerce')
    nom = indexes.CharField(model_attr = 'nom_produit')
    price = indexes.DecimalField(model_attr = 'prix') #Field to filter ON

    def get_model(self):
        return ProduitCommerce   

搜索/ search.html

{% extends 'base.html' %}

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

<form method="get" action=".">
    <table>
        {{ form.as_table }} <!------ FORM TO CHANGE BY A CUSTOM FORM BLOCK TO INCLUDE WITH DJANGO ------->
        <tr>
            <td>&nbsp;</td>
            <td>
                <input type="submit" value="Search">
            </td>
        </tr>
    </table>

    {% if query %}
        <h3>Results</h3>
        <!---------------------------- PLACE TO INCLUDE THE BUTTON TO FILTER ON result.object.prix------------------>
        {% for result in page.object_list %}
            <p>
                <a href="{{ result.object.get_absolute_url }}">{{ result.object.nom_produit }}{{result.object.prix}}</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>

produitcommerce_text.txt

{{ object.nom_produit }}
{{ object.nom_commerce }}
{{ object.description }} 
{{ object.prix }} 

PS:我正在研究1.5版本的django项目,并且像干草堆后端一样嗖嗖。

谢谢你的帮助:)

1 个答案:

答案 0 :(得分:0)

您正在获取可选模型复选框,因为您正在扩展ModelSearchForm:

#forms.py
from haystack.forms import ModelSearchForm
class ProduitForm(ModelSearchForm):

您可以通过扩展haystack提供的简单搜索表单变体来轻松避免此行为:

#forms.py
from haystack.forms import SearchForm
class ProduitForm(SearchForm):

然后,您将在应用程序的urls.py中添加以下内容:

#urls.py
from haystack.query import SearchQuerySet
from haystack.views import SearchView, search_view_factory
from myapp.models import Produit

urlpatterns = patterns('',  
    url(r'^produit/search/$', search_view_factory(
        view_class=SearchView,
        template='search/search.html',
        searchqueryset=SearchQuerySet().models(Resume),
        form_class=ProduitForm
    ), name='produit_search'),
)

请注意,尝试将其与最新版本的Haystack和Whoosh一起使用时,.models()过滤器存在错误。如果您遇到上述策略的任何问题,那么您应该确保您的Haystack和Whoosh版本2.0.0和2.4.1相对经过测试并且运行良好。

另外,与您的问题无关,您可能希望避免在settings.py中使用HAYSTACK_SEARCH_RESULTS_PER_PAGE。它也有一个非常丑陋的bug。只是分享我的经验。请注意,此信息与Whoosh有关,任何其他后端都可以正常工作。