Я пытаюсь развернуть свое приложение django на виртуальной машине Droplet (DigitalOcean), следуя этому руководство.
Для этой цели я успешно использовал nginx и gunicorn.
Проблема, с которой я сталкиваюсь, связана с django-select2 и заключается в том, что виджет формы всегда показать «Результаты не найдены». выдает ошибку 404, хотя в моей локальной среде все работает без нареканий!
Я пытался внедрить кеш (надеясь, что это решит проблему), но все становится еще хуже, поскольку с включенным кешем виджет, кажется, больше не работает даже в локальном режиме.
Теперь пришло время показать мой код:
настройки.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;
}
}
это моя конфигурация пушки:
[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, я сделал запрос на перенос проекта, изменив документацию, чтобы обратить внимание на этот случай!