Django-ajax-选择 AJAX_SELECT_BOOTSTRAP = False
Django-ajax-selects with AJAX_SELECT_BOOTSTRAP = False
我们在工作中使用 django-admin
webapp。我想对某些字段实施 django-ajax-selects
功能。我们的网络与 Internet 隔离,我无法使用 django-ajax-selects
的 CDN。文档说在这种情况下,您应该在 settings.py
文件中将 AJAX_SELECT_BOOTSTRAP
设置为 False
。但是,当我设置这个参数时,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
加载之前加载。我无法弄清楚,如何指定加载顺序或者可能有另一种方法?模板覆盖不是一个好主意,因为其他应用程序已经使用了一些覆盖,我担心它会导致一些冲突。
最后我需要做的是手动下载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
目录。
我们在工作中使用 django-admin
webapp。我想对某些字段实施 django-ajax-selects
功能。我们的网络与 Internet 隔离,我无法使用 django-ajax-selects
的 CDN。文档说在这种情况下,您应该在 settings.py
文件中将 AJAX_SELECT_BOOTSTRAP
设置为 False
。但是,当我设置这个参数时,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
加载之前加载。我无法弄清楚,如何指定加载顺序或者可能有另一种方法?模板覆盖不是一个好主意,因为其他应用程序已经使用了一些覆盖,我担心它会导致一些冲突。
最后我需要做的是手动下载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
目录。