Как отобразить 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 или добавлять зависимость.

Вернуться на верх