Как отобразить foreignkey в качестве параметра поиска в плагине Django cms
Я хочу иметь возможность использовать интерфейс autocomplete_fields из Django admin в Django CMS плагине
Я создал плагин, который имеет поле foreignkey :
class ProductBlock(CMSPlugin):
text = models.TextField()
product = models.ForeignKey(Product, on_delete=models.CASCADE, blank=True, null=True)
Когда я перехожу к добавлению плагина на страницу, опция отображается в виде выпадающего списка.
Я создал файл admin.py следующим образом:
class ProductBlockAdmin(admin.ModelAdmin):
autocomplete_fields = ['product']
admin.site.register(ProductBlock, ProductBlockAdmin)
В разделе администратора появляется поле с возможностью поиска, но оно не отображается в редакторе плагина.
Я использую django cms 4.1.3
Чтобы включить функцию автозаполнения для поля ForeignKey
в плагине Django CMS, вам нужно настроить форму плагина и использовать виджет, который поддерживает автозаполнение вне интерфейса администратора Django. Вот как этого можно добиться, используя пакет django-select2
:
1. Установка и настройка django-select2
Сначала установите пакет django-select2
:
pip install django-select2
Добавьте 'django_select2'
к вашему INSTALLED_APPS
в settings.py
:
INSTALLED_APPS = [
# ...
'django_select2',
# ...
]
2. Создание пользовательской модели формы
В вашем forms.py
создайте пользовательский ModelForm
для вашего плагина и укажите ModelSelect2Widget
для product
поля:
from django import forms
from django_select2.forms import ModelSelect2Widget
from .models import ProductBlock, Product
class ProductWidget(ModelSelect2Widget):
model = Product
search_fields = ['name__icontains'] # Adjust the field according to your Product model
class ProductBlockForm(forms.ModelForm):
class Meta:
model = ProductBlock
fields = '__all__'
widgets = {
'product': ProductWidget,
}
3. Обновление класса плагина CMS
В вашем cms_plugins.py
классе плагина укажите пользовательскую форму:
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from .models import ProductBlock
from .forms import ProductBlockForm
@plugin_pool.register_plugin
class ProductBlockPlugin(CMSPluginBase):
model = ProductBlock
form = ProductBlockForm
render_template = 'product_block.html'
4. Убедитесь, что статические файлы загружены
Убедитесь, что необходимые файлы JavaScript и CSS для django-select2
включены. В базовом шаблоне включите {{ form.media }}
в раздел <head>
:
<head>
<!-- ... other tags ... -->
{{ form.media }}
</head>
Альтернативный вариант - включить их напрямую:
<head>
<!-- ... other tags ... -->
{% include 'django_select2/django_select2.css' %}
{% include 'django_select2/django_select2.js' %}
</head>
5. Проверка и тестирование
Теперь при добавлении плагина на страницу поле product
должно отображать виджет автозаполнения, а не выпадающий список.
Примечание: Если у вас возникли проблемы со статическими файлами, убедитесь, что статические файлы правильно настроены и собраны, особенно в производственной среде.
Полагаю, самый простой способ - сделать следующее
class ProductBlockPlugin(CMSPluginBase):
autocomplete_fields = ['product']
...
Плагины Django CMS не регистрируют свои собственные ModelAdmin
, так как они уже являются подклассом ModelAdmin
и уже имеют встроенную функциональность автозаполнения.
Не нужно думать о версиях jQuery или добавлять зависимость.