54
54
55
55
import django
56
56
from django import forms
57
- from django .contrib .admin .widgets import SELECT2_TRANSLATIONS
57
+ from django .contrib .admin .widgets import SELECT2_TRANSLATIONS , AutocompleteMixin
58
58
from django .core import signing
59
59
from django .db .models import Q
60
60
from django .forms .models import ModelChoiceIterator
@@ -79,6 +79,9 @@ class Select2Mixin:
79
79
form media.
80
80
"""
81
81
82
+ css_class_name = "django-select2"
83
+ theme = None
84
+
82
85
empty_label = ""
83
86
84
87
def __init__ (self , * args , ** kwargs ):
@@ -90,7 +93,7 @@ def build_attrs(self, base_attrs, extra_attrs=None):
90
93
default_attrs = {
91
94
"lang" : self .i18n_name ,
92
95
"data-minimum-input-length" : 0 ,
93
- "data-theme" : settings .SELECT2_THEME ,
96
+ "data-theme" : self . theme or settings .SELECT2_THEME ,
94
97
}
95
98
if self .is_required :
96
99
default_attrs ["data-allow-clear" ] = "false"
@@ -102,9 +105,9 @@ def build_attrs(self, base_attrs, extra_attrs=None):
102
105
attrs = super ().build_attrs (default_attrs , extra_attrs = extra_attrs )
103
106
104
107
if "class" in attrs :
105
- attrs ["class" ] += " django-select2"
108
+ attrs ["class" ] += " " + self . css_class_name
106
109
else :
107
- attrs ["class" ] = "django-select2"
110
+ attrs ["class" ] = self . css_class_name
108
111
return attrs
109
112
110
113
def optgroups (self , name , value , attrs = None ):
@@ -137,6 +140,20 @@ def media(self):
137
140
)
138
141
139
142
143
+ class Select2AdminMixin :
144
+ """Select2 mixin that uses Django's own select template."""
145
+
146
+ css_class_name = "admin-autocomplete"
147
+ theme = "admin-autocomplete"
148
+
149
+ @property
150
+ def media (self ):
151
+ return forms .Media (
152
+ js = Select2Mixin .media .js ,
153
+ css = AutocompleteMixin .media .css ,
154
+ )
155
+
156
+
140
157
class Select2TagMixin :
141
158
"""Mixin to add select2 tag functionality."""
142
159
0 commit comments