将用户对象和筛选的对象列表传递到自定义的SearchView子类中

时间:2013-02-05 10:03:55

标签: python django django-templates django-views django-haystack

所以我有一个设置为通用haystack url的模板:

url(r'^$', search_view_factory(
    view_class=SearchView,
    template='base.html',
    searchqueryset=sqs,
    form_class=ModelSearchForm
), name='haystack_search'),

我需要删除tasks.filter(completed=False).order_by('priority', 'dueDate')之类的内容。

现在在模板中我可以通过user.get_profile.task_set.all来完成任务,但是我无法执行过滤和排序。

通过视图条目很容易解决,但由于干草堆没有指向视图,我如何将过滤后的有序列表传递到模板中?

我需要提一下过滤后的&有序列表与haystack的搜索功能无关。

2 个答案:

答案 0 :(得分:1)

不使用SearchView,而是创建子类并定义方法extra_context

class MySearchView(SearchView):

    def extra_context(self):
        return { 'ordered_tasks': ... }

此方法必须返回带有其他上下文变量的字典。

最后,在调用view_class时将此新视图类传递给search_view_factory

答案 1 :(得分:0)

感谢Simeon的回答以及其他一些stackoverflow问题让我意识到在self.request.user类的def extra_context(self):方法中使用CustomSearchView(SearchView)的可能性,我能够解决我的问题,就像这样。
内部views.py

from haystack.views import SearchView
class MySearchView(SearchView):    

    def extra_context(self):
        if self.request.user.is_authenticated:
            member = self.request.user.get_profile()
        else:
            # just fooling the haystack config, since this view is set to localhost
            return { 'x' : 0 }  # which would be equivalent to a direct_to_template view


        # getting member tasks
        tasks = list()
        for elem in member.task_set.all().filter(completed=False).order_by('priority', 'dueDate')[:5]:
            tasks.append(elem)

        return { 'tasks': tasks }

在模板中:

<a href="tasks/" style="color: #ffffff">Tasks</a>
    <ul id="tasksPane">
        {% for task in tasks %}
            <li><a href="/tasks/{{ task.id }}" id="tasksP" {% if task.priority == 'c' %} style="color: #99ff44" {% endif %}
                                                            {% if task.priority == 'b' %} style="color: #024dac" {% endif %}
                                                            {% if task.priority == 'a' %} style="color: #aa0022" {% endif %}
                ><input type="checkbox" name="task" value="completed">{{ task.task }}</a></li>
        {% endfor %}
    </ul>

这样,我不需要在模板中做任何主要逻辑,这就是我所需要的,并且我认为django会拒绝这样的方法,因为它不会允许模板中的filterorder_by方法 当然,在我的urls.py

# haystack
from haystack.forms import ModelSearchForm
from haystack.query import SearchQuerySet
from haystack.views import SearchView, search_view_factory
sqs = SearchQuerySet()
from member.views import MySearchView

urlpatterns = patterns('',
    url(r'^$', search_view_factory(
        view_class=MySearchView,
        template='base.html',
        searchqueryset=sqs,
        form_class=ModelSearchForm
    ), name='haystack_search'),
)