Изменение фильтра горизонтального поля поиска django
Я использую filter_horizontal в админке django.
Существует виноградник под названием Шато Монло. Когда я пытаюсь набрать Château в строке поиска, оно появляется. Но когда я набираю Chateau (без иностранного символа) в строке поиска, он не появляется.
Я хочу, чтобы он появлялся, когда я набираю и Château, и Chateau. Как я могу это сделать?
Этот фильтр реализован как пользовательский виджет javascript, который включен в django.contrib.admin.
Я думаю, вы могли бы получить то, что хотите, с помощью небольшого изменения метода SelectBox.filter. Мы можем использовать этот трюк для удаления ударений и диакритических знаков во всех узлах, по которым вы выполняете поиск.
str.normalize('NFD').replace(/[\u0300-\u036f]/g, "");
Источник: https://stackoverflow.com/a/37511463/1977847
Например, вы можете добавить некоторый javascript в шаблон администратора для формы изменений, чтобы переопределить оригинальный фильтр поиска.
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#overriding-admin-templates
Может сработать что-то вроде этого, расширяя встроенный admin/change_form.html
.
{% extends 'admin/change_form.html' %}
{% block admin_change_form_document_ready %}
{{ block.super }}
<script>
if (window.SelectBox) {
window.SelectBox.filter = function(id, text) {
const tokens = text.toLowerCase().split(/\s+/);
for (const node of SelectBox.cache[id]) {
node.displayed = 1;
// lowercase and strip accents off each node text in the filter list
const node_text = node.text
.toLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, "");
for (const token of tokens) {
if (!node_text.includes(token)) {
node.displayed = 0;
break;
}
}
}
SelectBox.redisplay(id);
}
}
</script>
{% endblock %}
Существуют и другие способы добавления пользовательского javascript на сайт администратора, но этот способ очень быстрый и грязный.