使用django-autocomplete-light v3自定义项目的输出

时间:2016-08-03 02:03:10

标签: jquery python django django-autocomplete-light

在早期版本的django-autocomplete-light中,您可以使用模板呈现每个返回的条目,其中包括插入自定义HTML的能力

我无法弄清楚如何使用常规API来做到这一点,所以我正在尝试添加它。

到目前为止,我有一个使用mark_safe的类,并且正在传递HTML:

class TemplateRenderSelect2QuerySetView(autocomplete.Select2QuerySetView):
    def get_result_label(self, result):
        """Return the label of a result."""
        template = get_template("autocomplete_light/item.html")

        context = Context({"item": result})
        return mark_safe(template.render(context))

模板autocomplete_light/item.html是:

<b>{{ item.name }}</b>

但那被渲染为:

enter image description here

但JSON使用正确的标签是正确的:

{"pagination": {"more": false}, "results": [{"text": "<b>Victoria</b>", "id": 11}]}

如何让django-admin正确呈现HTML?

编辑:我在自定义HTML上找到了一些extra documentation,并尝试针对小部件设置attrs={'data-html': 'true'},但它仍无法正常工作

1 个答案:

答案 0 :(得分:1)

一如既往,答案是子类化,在这种情况下,提示是覆盖get_result_title

class CustomisableAutocomplete(autocomplete.Select2QuerySetView):
    template_name = "autocomplete_light/item.html"

    def get_result_title(self, result):
        """Return the label of a result."""

        template = get_template(self.template_name)
        context = Context({"result": result})
        return template.render(context)

如果您想要一个没有标签混乱的标题,您可以覆盖get_results并返回更多数据:

class CustomisableAutocomplete(autocomplete.Select2QuerySetView):
    template_name = "autocomplete_light/item.html"
    def get_result_title(self, result):
        """Return the title of a result."""
        return six.text_type(result)

    def get_result_text(self, result):
        """Return the label of a result."""

        template = get_template(self.template_name)
        context = Context({"result": result})
        return template.render(context)

    def get_results(self, context):
        """Return data for the 'results' key of the response."""
        return [
            {
                'id': self.get_result_value(result),
                'title': self.get_result_title(result),
                'text': self.get_result_text(result),
            } for result in context['object_list']
        ]