首页 > 解决方案 > Django-ajax-selects 与 AJAX_SELECT_BOOTSTRAP = False

问题描述

在工作中,我们正在使用django-adminwebapp。我想为django-ajax-selects某些领域实现功能。我们的网络与 Internet 隔离,我无法使用django-ajax-selectsCDN。文档说,在这种情况下,您应该AJAX_SELECT_BOOTSTRAP在文件False中设置。settings.py但是,当我设置此参数时,django-ajax-selects无法使用django's jqueryDjango的版本1.11.10Python2

重现我的问题的步骤:

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_selectINSTALLED_APPS

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

项目/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's之前jquery加载。我想不通,我该如何指定加载顺序,或者可能有另一种方式?模板覆盖不是一个好主意,因为其他应用程序已经使用了一些覆盖,我担心它会导致一些冲突。

标签: pythondjangodjango-admindjango-ajax-selects

解决方案


最后我需要做的是手动下载jquery.min.jsjquery-ui.js和库,jquery-ui.cssjquery-ui images它们放入应用程序的static目录并指向它们admin.py

管理员.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目录。


推荐阅读