所以我有一个设置为通用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的搜索功能无关。
答案 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会拒绝这样的方法,因为它不会允许模板中的filter
和order_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'),
)