如何使用Django-Haystack预先选择构面(即在页面加载时选中复选框)?

时间:2019-02-16 18:37:07

标签: django python-3.x django-haystack faceted-search django-oscar

在下面的图片中,您可以看到cpu_producer == ""(即未选择任何内容)时的外观。

enter image description here

在某些情况下,cpu_producer可能是AMD或INTEL,并且在页面加载时必须选中相应构面的复选框。如何在后端选择它以便在前端获得经过适当过滤的cpu?

if category.slug == 'cpu':
    possible_sockets = '(socket_exact:"LGA1151" OR socket_exact:"LGA2066" OR socket_exact:"AM4" OR socket_exact:"TR4")'
    sqs = sqs.narrow(possible_sockets)

    possible_producers = '(producer_exact:"AMD" OR producer_exact:"INTEL")'
    sqs = sqs.narrow(possible_producers)

    cpu_producer = RECEIVED_VALUE  # "AMD" or "INTEL" or ""

    # I NEED SOMETHING LIKE THIS.
    if cpu_producer:
        sqs.PRESELECT(producer=cpu_producer)

2 个答案:

答案 0 :(得分:2)

通过源代码挖掘,我找到了文件haystack/forms.py。似乎应该重写类FacetedSearchForm

但是,在我的情况下,仅提供如下网址是可以接受的:

<a href="{{request.get_full_path}}cpu/?selected_facets=vendor_exact%3AAMD">
    <img src="{% static 'logo/amd.jpg' %}" alt="{{ cpu_producer.title }}" />
</a>

会转到CPU页面,并且由于?selected_facets=vendor_exact%3AAMD部分会自动选择Producer构面(在这种情况下为AMD)。

答案 1 :(得分:0)

您可以使用JavaScript。页面加载后,获取所有GET参数并迭代每个复选框:

function setCheckedItems() {
    var all_params = getQueryParams(); // GET params
    $.each( all_params, function( key, value ) {
        id = decodeURIComponent(key).replace(/\s/g,'');
        $('#'+id).attr('checked', 'checked');
    });
}