Django-ajax-select с помощью AJAX_SELECT_BOOTSTRAP = False - PullRequest
0 голосов
/ 28 апреля 2019

На работе мы используем django-admin веб-приложение.Я хотел реализовать функциональность django-ajax-selects в некоторых областях.Наша сеть изолирована от Интернета, и я не могу использовать CDN django-ajax-selects.Документация говорит, что в этом случае вы должны установить AJAX_SELECT_BOOTSTRAP на False в settings.py файле.Однако когда я устанавливаю этот параметр, django-ajax-selects не может использовать django jquery.Django версия 1.11.10, Python2.

Действия по воспроизведению моей проблемы:

pip install django==1.11.10 django-ajax-selects
django-admin startproject proj ./
python manage.py startapp test_app
python manage.py migrate
python manage.py createsuperuser

test_app / models.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models


class Tag(models.Model):
    name = models.CharField(max_length=100)
    something = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class SecondModel(models.Model):
    name = models.CharField(max_length=200)
    tag = models.ForeignKey(Tag, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

test_app / lookups.py

from ajax_select import register, LookupChannel
from .models import Tag

@register('tags')
class TagsLookup(LookupChannel):

    model = Tag

    def get_query(self, q, request):
        return self.model.objects.filter(name__icontains=q)

    def format_item_display(self, item):
        return u"<span class='tag'>%s</span>" % item.name

test_app / admin.py

# -*- coding: utf-8 -*-
from django.contrib import admin
from ajax_select import make_ajax_form
from .models import Tag, SecondModel


@admin.register(Tag)
class TagAdmin(admin.ModelAdmin):
    fields = ['name', 'something']


@admin.register(SecondModel)
class SecondModelAdmin(admin.ModelAdmin):

    form = make_ajax_form(SecondModel, {
        'tag': 'tags'
    })

proj/settings.py - добавление приложения и ajax_select к INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'ajax_select',
    'test_app',
)

proj / urls.py

from django.conf.urls import url, include
from django.contrib import admin
from ajax_select import urls as ajax_select_urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^ajax_select/', include(ajax_select_urls)),
]

Тогда

python manage.py makemigrations test_app
python manage.py migrate

Если я запускаю сервер таким образом, он работает абсолютно нормально (потому что он использует CDN для загрузки jquery и прочего).Но если я установлю AJAX_SELECT_BOOTSTRAP на False, я получу TypeError в консоли браузера, и функциональность ajax не будет работать.Я думаю, ajax_select.js просто загружается до того, как django jquery было загружено.Я не смог разобраться, как можно указать порядок загрузки или может быть есть другой способ?Переопределение шаблонов было бы не очень хорошей идеей, поскольку некоторые приложения уже переопределены, и я боюсь, что это может вызвать конфликты.

1 Ответ

0 голосов
/ 29 апреля 2019

В конце концов мне нужно было вручную загрузить библиотеки jquery.min.js, jquery-ui.js, jquery-ui.css, а также jquery-ui images, поместить их в каталог static приложения и указать на них в admin.py:

admin.py

...
@admin.register(SecondModel)
class SecondModelAdmin(admin.ModelAdmin):
    form = SecondModelForm

    class Media:
        js = ["/static/js/jquery.min.js",
              "/static/js/jquery-ui.js"]
        css = {'all': ["/static/css/jquery-ui.css"]}

Также не забудьте запустить python manage.py collectstatic для статических файлов, которые будут скопированы в общий каталог static.

...