Django-select2 бросает "Результаты не могут быть загружены".
Я пытаюсь развернуть свое приложение django на виртуальной машине Droplet (DigitalOcean), следуя этому руководству.
Для этого я с успехом использовал nginx и gunicorn.
Проблема, с которой я сталкиваюсь, связана с django-select2 и заключается в том, что виджет формы всегда показывает "Результаты не могут быть найдены". выдает ошибку 404, в то время как в моем локальном окружении это работает безупречно!
Я пытался реализовать кеш (надеясь, что это решит проблему), но дела обстоят хуже, так как с включенным кешем виджет больше не работает даже в локальном режиме.
Теперь настало время показать мой код:
settings.py:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
},
'select2': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
'TIMEOUT': 60 * 60 * 24,
},
}
SELECT2_CACHE_BACKEND = 'select2'
Это код, выполненный в соответствии с указанным здесь руководством.
PS: обратите внимание, что использование redis вместо memcached дает тот же результат
это моя конфигурация nginx:
server {
listen 80;
server_name 46.101.134.225;
client_max_body_size 2M;
location = /favicon.ico { access_log off; log_not_found off; }
location /static {
root /projectname;
}
location /media {
root /projectname/staticfiles;
}
location /assets {
root /;
}
location / {
include proxy_params;
proxy_pass http://unix:/projectname/projectname.sock;
}
}
это моя конфигурация gunicorn:
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/projectname
ExecStart=/projectname/bin/gunicorn --access-logfile - --workers 3 --bind unix:/projectname/projectname.sock projectname.wsgi:application
[Install]
WantedBy=multi-user.target
это моя форма с виджетами:
from django_select2.forms import ModelSelect2Widget, ModelSelect2MultipleWidget
...
class CompanyForm(BaseModeratedObjectForm):
...
city = forms.ModelChoiceField(widget=ModelSelect2Widget(
model=City, search_fields=['name__istartswith']
), queryset=City.objects.all(), required=False)
...
treatments = forms.ModelMultipleChoiceField(widget=ModelSelect2MultipleWidget(
model=Treatment, search_fields=['name__icontains']
), queryset=Treatment.objects.all(), required=False)
...
PS: обратите внимание, что перед реализацией кеша я получил следующие результаты:
- Отлично работает в моей местной среде.
- Иногда работаю в производственной среде (иногда данные появляются при наборе текста).
После реализации кеша ничего больше не работает (в моей локальной среде, вручную переходя по URL select2, я вижу, что он отображает ошибку field_id not found
РЕДАКТИРОВАТЬ:
Поскольку мой ответ был принят даже в репозитории django-select2 на github, я сделал запрос на изменение проекта, изменив документацию, чтобы обратить внимание на этот случай!
3 ответа
Мне наконец удалось решить эту проблему, проблема заключалась в том, что при реализации кэша Redis система не смогла найти сервер Redis. Установка с помощью sudo apt-get install redis-server
решил проблему, наряду с использованием кэша Redis!
Добавление комментария для всех, кто борется с этим. Похоже, это вызвано проблемами в вашем кеше. Убедитесь, что вы не используете кеш locmem в рабочей среде или фиктивный кеш. Я решил это, перейдя в кеш базы данных:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
},
'select2': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'select2_cache_table',
}
}
SELECT2_CACHE_BACKEND: str = 'select2'
Перейдите по этой ссылке , чтобы узнать больше о параметрах кэширования. Убедитесь, что вы выполнили все шаги для правильной настройки кеша.
Также установлен redis, но решением может быть параметр TIMEOUT в settings.py. Хотя не уверен