现有模板上的haystack

时间:2015-10-04 11:08:36

标签: django elasticsearch django-haystack django-class-based-views

如何在现有的views.py中实现SearchView? 我已经有了CBV,并在urls.py中添加为/ moderate并希望在其中应用搜索表单。但总是得到“结果没有找到结果。”

这是我的/中等页面,包含3个表单,使用SearchView和模板中教程的一段代码。

enter image description here

这是来自/搜索页面,其中包含网址(r'^ search / $',include('haystack.urls'))

enter image description here

urls.py

urlpatterns= [
    url(r'^search/', include('haystack.urls')),
    url(r'^moderate/', Moderate.as_view(), name='moderate'),
]

views.py

class Moderate(SearchView):

    @method_decorator(staff_member_required)
    def dispatch(self, *args, **kwargs):
        return super(Moderate, self).dispatch(*args, **kwargs)

    #model = Ad
    template_name = 'adapp/ad_moderate.html'
    #template_name = 'search/search.html'

    paginator_class = DiggPaginator
    paginate_by = 10
    ad_type = None
    ad_sub_type = None

    def get_queryset(self):
        qs = super(Moderate, self).get_queryset().filter(ad_type__isnull=False,
                                                           ad_sub_type__isnull=False)

        return qs

    def get_context_data(self, **kwargs):
        context = super(Moderate, self).get_context_data(**kwargs)
        context['filter'] = ModerateFilter(self.request.GET)

        return context

    # define method to recieve fields from form, and change data accordings
    def post(self, request, *args, **kwargs):
        selected = request.POST['selected']
        record = Ad.objects.get(pk=int(selected))
        form = ModerateForm(request.POST, instance=record)
        if form.is_valid():
            form.save(commit=True)
            return HttpResponseRedirect('')

模板/ ad_moderate.html

{% extends 'base.html' %}

{% load i18n url_tags %}

{% block content %}
    <div id="casing">
        <div id="content">

{# filter form, to show only models with moderated=True #}
    <form action="" method="get">
        {{ filter.form.as_p }}
        <input type="submit">
    </form>

    <h2>Search</h2>

{# search form right from tutorial #}
    <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.title }}</a>
                </p>
            {% empty %}
                <p>No results found.</p>
            {% endfor %}

        {% else %}
            {# Show some example queries to run, maybe query syntax, something else? #}
        {% endif %}
    </form>

            {% for object in filter %}
{# a lot of template tags and third form to change value of model #}
                    <form action="" method="POST">
                        {% csrf_token %}
                        <input type="radio" name="moderated" value="True">Accept
                        <br>
                        <input type="radio" name="moderated" value="False">Decline
                        <input type="hidden" value="{{ object.id }}"
                        name="selected">
                        <input class="btn" type="submit" value="moderate">
                    </form>

search_indexes.py

from .models import Ad

class AdIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    def get_model(self):
    # my model, with one search should be
        return Ad

模板/搜索/索引/应用程序/ ad_text.txt

{{ object.title }}
{{ object.short_desc }}
{{ object.description }}
{{ object.experience }}
{{ object.skills }}
{{ object.name }}
{{ object.city }}

1 个答案:

答案 0 :(得分:0)

get_context_data():
    context['search'] = SearchForm(self.request.GET).search()

会解决问题。

这意味着,我应该创建表单并从.save()方法发送返回,而不是类似django的表单实例。