django-searchkit 1.1__py3-none-any.whl → 1.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- build/lib/build/lib/build/lib/build/lib/example/example/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/example/example/admin.py +16 -0
- build/lib/build/lib/build/lib/build/lib/example/example/asgi.py +16 -0
- build/lib/build/lib/build/lib/build/lib/example/example/management/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/example/example/management/commands/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/example/example/management/commands/createtestdata.py +62 -0
- build/lib/build/lib/build/lib/build/lib/example/example/migrations/0001_initial.py +48 -0
- build/lib/build/lib/build/lib/build/lib/example/example/migrations/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/example/example/models.py +38 -0
- build/lib/build/lib/build/lib/build/lib/example/example/settings.py +125 -0
- build/lib/build/lib/build/lib/build/lib/example/example/urls.py +23 -0
- build/lib/build/lib/build/lib/build/lib/example/example/wsgi.py +16 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/__version__.py +16 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/admin.py +44 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/apps.py +6 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/filters.py +36 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/forms/__init__.py +5 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/forms/fields.py +56 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/forms/search.py +61 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/forms/searchkit.py +177 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/forms/utils.py +154 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/migrations/0001_initial.py +30 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py +18 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/migrations/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/models.py +21 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/templatetags/__init__.py +0 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/templatetags/searchkit.py +20 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/tests.py +400 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/urls.py +7 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/utils.py +13 -0
- build/lib/build/lib/build/lib/build/lib/searchkit/views.py +23 -0
- build/lib/build/lib/build/lib/example/example/__init__.py +0 -0
- build/lib/build/lib/build/lib/example/example/admin.py +16 -0
- build/lib/build/lib/build/lib/example/example/asgi.py +16 -0
- build/lib/build/lib/build/lib/example/example/management/__init__.py +0 -0
- build/lib/build/lib/build/lib/example/example/management/commands/__init__.py +0 -0
- build/lib/build/lib/build/lib/example/example/management/commands/createtestdata.py +62 -0
- build/lib/build/lib/build/lib/example/example/migrations/0001_initial.py +48 -0
- build/lib/build/lib/build/lib/example/example/migrations/__init__.py +0 -0
- build/lib/build/lib/build/lib/example/example/models.py +38 -0
- build/lib/build/lib/build/lib/example/example/settings.py +125 -0
- build/lib/build/lib/build/lib/example/example/urls.py +23 -0
- build/lib/build/lib/build/lib/example/example/wsgi.py +16 -0
- build/lib/build/lib/build/lib/searchkit/__init__.py +0 -0
- build/lib/build/lib/build/lib/searchkit/__version__.py +16 -0
- build/lib/build/lib/build/lib/searchkit/admin.py +44 -0
- build/lib/build/lib/build/lib/searchkit/apps.py +6 -0
- build/lib/build/lib/build/lib/searchkit/filters.py +36 -0
- build/lib/build/lib/build/lib/searchkit/forms/__init__.py +5 -0
- build/lib/build/lib/build/lib/searchkit/forms/fields.py +56 -0
- build/lib/build/lib/build/lib/searchkit/forms/search.py +61 -0
- build/lib/build/lib/build/lib/searchkit/forms/searchkit.py +177 -0
- build/lib/build/lib/build/lib/searchkit/forms/utils.py +154 -0
- build/lib/build/lib/build/lib/searchkit/migrations/0001_initial.py +30 -0
- build/lib/build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py +18 -0
- build/lib/build/lib/build/lib/searchkit/migrations/__init__.py +0 -0
- build/lib/build/lib/build/lib/searchkit/models.py +21 -0
- build/lib/build/lib/build/lib/searchkit/templatetags/__init__.py +0 -0
- build/lib/build/lib/build/lib/searchkit/templatetags/searchkit.py +20 -0
- build/lib/build/lib/build/lib/searchkit/tests.py +400 -0
- build/lib/build/lib/build/lib/searchkit/urls.py +7 -0
- build/lib/build/lib/build/lib/searchkit/utils.py +13 -0
- build/lib/build/lib/build/lib/searchkit/views.py +23 -0
- build/lib/build/lib/example/example/admin.py +1 -1
- build/lib/build/lib/searchkit/__version__.py +1 -1
- build/lib/build/lib/searchkit/admin.py +15 -1
- build/lib/build/lib/searchkit/filters.py +15 -6
- build/lib/build/lib/searchkit/forms/fields.py +5 -4
- build/lib/build/lib/searchkit/forms/search.py +0 -1
- build/lib/build/lib/searchkit/forms/searchkit.py +36 -13
- build/lib/build/lib/searchkit/forms/utils.py +50 -74
- build/lib/build/lib/searchkit/models.py +0 -6
- build/lib/build/lib/searchkit/tests.py +1 -3
- build/lib/build/lib/searchkit/utils.py +13 -0
- build/lib/build/lib/searchkit/views.py +3 -3
- build/lib/example/example/admin.py +1 -1
- build/lib/searchkit/__version__.py +1 -1
- build/lib/searchkit/admin.py +15 -1
- build/lib/searchkit/filters.py +15 -6
- build/lib/searchkit/forms/fields.py +5 -4
- build/lib/searchkit/forms/search.py +0 -1
- build/lib/searchkit/forms/searchkit.py +36 -13
- build/lib/searchkit/forms/utils.py +50 -74
- build/lib/searchkit/models.py +0 -6
- build/lib/searchkit/tests.py +1 -3
- build/lib/searchkit/utils.py +13 -0
- build/lib/searchkit/views.py +3 -3
- {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/METADATA +1 -1
- django_searchkit-1.3.dist-info/RECORD +166 -0
- searchkit/__version__.py +1 -1
- searchkit/admin.py +15 -1
- searchkit/filters.py +15 -6
- searchkit/forms/fields.py +5 -4
- searchkit/forms/search.py +0 -1
- searchkit/forms/searchkit.py +36 -13
- searchkit/forms/utils.py +50 -74
- searchkit/models.py +0 -6
- searchkit/tests.py +1 -3
- searchkit/utils.py +13 -0
- searchkit/views.py +3 -3
- django_searchkit-1.1.dist-info/RECORD +0 -99
- {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/WHEEL +0 -0
- {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/licenses/LICENCE +0 -0
- {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/top_level.txt +0 -0
- {django_searchkit-1.1.dist-info → django_searchkit-1.3.dist-info}/zip-safe +0 -0
searchkit/forms/searchkit.py
CHANGED
@@ -1,19 +1,30 @@
|
|
1
1
|
from django import forms
|
2
|
+
from django.apps import apps
|
3
|
+
from django.contrib.admin import widgets
|
4
|
+
from django.contrib.contenttypes.models import ContentType
|
2
5
|
from django.utils.translation import gettext_lazy as _
|
3
6
|
from django.utils.functional import cached_property
|
4
7
|
from .utils import CssClassMixin, FIELD_PLAN, OPERATOR_DESCRIPTION
|
5
8
|
from .utils import SUPPORTED_FIELDS
|
6
9
|
from .utils import ModelTree
|
7
10
|
from .utils import MediaMixin
|
8
|
-
from .
|
11
|
+
from .fields import DateRangeField
|
12
|
+
from ..utils import is_searchable_model
|
9
13
|
|
10
14
|
|
11
15
|
class SearchkitModelForm(forms.Form):
|
12
16
|
"""
|
13
17
|
Form to select a content type.
|
14
18
|
"""
|
19
|
+
def __init__(self, *args, **kwargs):
|
20
|
+
super().__init__(*args, **kwargs)
|
21
|
+
models = [m for m in apps.get_models() if is_searchable_model(m)]
|
22
|
+
ids = [ContentType.objects.get_for_model(m).id for m in models]
|
23
|
+
queryset = self.fields['searchkit_model'].queryset.filter(pk__in=ids)
|
24
|
+
self.fields['searchkit_model'].queryset = queryset
|
25
|
+
|
15
26
|
searchkit_model = forms.ModelChoiceField(
|
16
|
-
queryset=
|
27
|
+
queryset=ContentType.objects.all().order_by('app_label', 'model'),
|
17
28
|
label=_('Model'),
|
18
29
|
empty_label=_('Select a Model'),
|
19
30
|
widget=forms.Select(attrs={
|
@@ -105,27 +116,19 @@ class BaseSearchkitForm(MediaMixin, CssClassMixin, forms.Form):
|
|
105
116
|
return choices
|
106
117
|
|
107
118
|
def _add_field_name_field(self):
|
108
|
-
initial = self.initial.get('field')
|
109
119
|
choices = self._get_model_field_choices()
|
110
|
-
field = forms.ChoiceField(label=_('Model field'), choices=choices
|
120
|
+
field = forms.ChoiceField(label=_('Model field'), choices=choices)
|
111
121
|
field.widget.attrs.update({"class": self.reload_on_change_css_class})
|
112
122
|
self.fields['field'] = field
|
113
123
|
|
114
124
|
def _add_operator_field(self):
|
115
|
-
initial = self.initial.get('operator')
|
116
125
|
choices = [(o, OPERATOR_DESCRIPTION[o]) for o in self.field_plan.keys()]
|
117
|
-
field = forms.ChoiceField(label=_('Operator'), choices=choices
|
126
|
+
field = forms.ChoiceField(label=_('Operator'), choices=choices)
|
118
127
|
field.widget.attrs.update({"class": self.reload_on_change_css_class})
|
119
128
|
self.fields['operator'] = field
|
120
129
|
|
121
130
|
def _add_value_field(self):
|
122
|
-
|
123
|
-
field_class = self.field_plan[self.operator][0]
|
124
|
-
if getattr(field_class, 'choices', None) and getattr(self.model_field, 'choices', None):
|
125
|
-
field = field_class(choices=self.model_field.choices, initial=initial)
|
126
|
-
else:
|
127
|
-
field = field_class()
|
128
|
-
self.fields['value'] = field
|
131
|
+
self.fields['value'] = self.field_plan[self.operator](self.model_field)
|
129
132
|
|
130
133
|
|
131
134
|
class BaseSearchkitFormSet(CssClassMixin, forms.BaseFormSet):
|
@@ -143,6 +146,26 @@ class BaseSearchkitFormSet(CssClassMixin, forms.BaseFormSet):
|
|
143
146
|
def get_default_prefix(self):
|
144
147
|
return "searchkit"
|
145
148
|
|
149
|
+
@cached_property
|
150
|
+
def uses_date_widget(self):
|
151
|
+
"""
|
152
|
+
Check if the form uses a date widget.
|
153
|
+
"""
|
154
|
+
for form in self.forms:
|
155
|
+
for field in form.fields.values():
|
156
|
+
if isinstance(field.widget, (widgets.AdminDateWidget, widgets.AdminSplitDateTime)):
|
157
|
+
return True
|
158
|
+
elif isinstance(field, DateRangeField):
|
159
|
+
return True
|
160
|
+
return False
|
161
|
+
|
162
|
+
@cached_property
|
163
|
+
def forms(self):
|
164
|
+
if self.model:
|
165
|
+
return super().forms
|
166
|
+
else:
|
167
|
+
return []
|
168
|
+
|
146
169
|
|
147
170
|
def searchkit_formset_factory(model, **kwargs):
|
148
171
|
form = type('SearchkitForm', (BaseSearchkitForm,), dict(model=model))
|
searchkit/forms/utils.py
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
from modeltree import ModelTree as BaseModelTree
|
2
2
|
from collections import OrderedDict
|
3
|
-
from django.
|
4
|
-
from django.contrib import admin
|
5
|
-
from django.contrib.contenttypes.models import ContentType
|
3
|
+
from django.contrib.admin.widgets import AdminDateWidget, AdminSplitDateTime
|
6
4
|
from django.db import models
|
7
|
-
from django.db.utils import OperationalError
|
8
5
|
from django import forms
|
9
6
|
from django.utils.translation import gettext_lazy as _
|
10
|
-
from ..filters import SearchkitFilter
|
11
7
|
from . import fields as searchkit_fields
|
12
8
|
|
13
9
|
|
@@ -50,94 +46,95 @@ FIELD_PLAN = OrderedDict((
|
|
50
46
|
(
|
51
47
|
lambda f: isinstance(f, models.BooleanField),
|
52
48
|
{
|
53
|
-
'exact':
|
49
|
+
'exact': lambda f: forms.NullBooleanField() if f.null else forms.BooleanField(),
|
54
50
|
}
|
55
51
|
),
|
56
52
|
(
|
57
53
|
lambda f: isinstance(f, models.CharField) and f.choices,
|
58
54
|
{
|
59
|
-
'exact':
|
60
|
-
'contains':
|
61
|
-
'startswith':
|
62
|
-
'endswith':
|
63
|
-
'regex':
|
64
|
-
'in':
|
55
|
+
'exact': lambda f: forms.ChoiceField(choices=f.choices),
|
56
|
+
'contains': lambda f: forms.CharField(),
|
57
|
+
'startswith': lambda f: forms.CharField(),
|
58
|
+
'endswith': lambda f: forms.CharField(),
|
59
|
+
'regex': lambda f: forms.CharField(),
|
60
|
+
'in': lambda f: forms.MultipleChoiceField(choices=f.choices),
|
65
61
|
}
|
66
62
|
),
|
67
63
|
(
|
68
64
|
lambda f: isinstance(f, models.CharField),
|
69
65
|
{
|
70
|
-
'exact':
|
71
|
-
'contains':
|
72
|
-
'startswith':
|
73
|
-
'endswith':
|
74
|
-
'regex':
|
66
|
+
'exact': lambda f: forms.CharField(),
|
67
|
+
'contains': lambda f: forms.CharField(),
|
68
|
+
'startswith': lambda f: forms.CharField(),
|
69
|
+
'endswith': lambda f: forms.CharField(),
|
70
|
+
'regex': lambda f: forms.CharField(),
|
75
71
|
}
|
76
72
|
),
|
77
73
|
(
|
78
74
|
lambda f: isinstance(f, models.IntegerField) and f.choices,
|
79
75
|
{
|
80
|
-
'exact':
|
81
|
-
'
|
82
|
-
'
|
83
|
-
'
|
84
|
-
'
|
85
|
-
'
|
76
|
+
'exact': lambda f: forms.ChoiceField(choices=f.choices),
|
77
|
+
'gt': lambda f: forms.IntegerField(),
|
78
|
+
'gte': lambda f: forms.IntegerField(),
|
79
|
+
'lt': lambda f: forms.IntegerField(),
|
80
|
+
'lte': lambda f: forms.IntegerField(),
|
81
|
+
'range': lambda f: searchkit_fields.IntegerRangeField(),
|
82
|
+
'in': lambda f: forms.MultipleChoiceField(choices=f.choices),
|
86
83
|
}
|
87
84
|
),
|
88
85
|
(
|
89
86
|
lambda f: isinstance(f, models.IntegerField),
|
90
87
|
{
|
91
|
-
'exact':
|
92
|
-
'gt':
|
93
|
-
'gte':
|
94
|
-
'lt':
|
95
|
-
'lte':
|
96
|
-
'range':
|
88
|
+
'exact': lambda f: forms.IntegerField(),
|
89
|
+
'gt': lambda f: forms.IntegerField(),
|
90
|
+
'gte': lambda f: forms.IntegerField(),
|
91
|
+
'lt': lambda f: forms.IntegerField(),
|
92
|
+
'lte': lambda f: forms.IntegerField(),
|
93
|
+
'range': lambda f: searchkit_fields.IntegerRangeField(),
|
97
94
|
}
|
98
95
|
),
|
99
96
|
(
|
100
97
|
lambda f: isinstance(f, models.FloatField),
|
101
98
|
{
|
102
|
-
'exact':
|
103
|
-
'gt':
|
104
|
-
'gte':
|
105
|
-
'lt':
|
106
|
-
'lte':
|
107
|
-
'range':
|
99
|
+
'exact': lambda f: forms.FloatField(),
|
100
|
+
'gt': lambda f: forms.FloatField(),
|
101
|
+
'gte': lambda f: forms.FloatField(),
|
102
|
+
'lt': lambda f: forms.FloatField(),
|
103
|
+
'lte': lambda f: forms.FloatField(),
|
104
|
+
'range': lambda f: searchkit_fields.IntegerRangeField(),
|
108
105
|
}
|
109
106
|
),
|
110
107
|
(
|
111
108
|
lambda f: isinstance(f, models.DecimalField),
|
112
109
|
{
|
113
|
-
'exact':
|
114
|
-
'gt':
|
115
|
-
'gte':
|
116
|
-
'lt':
|
117
|
-
'lte':
|
118
|
-
'range':
|
110
|
+
'exact': lambda f: forms.DecimalField(),
|
111
|
+
'gt': lambda f: forms.DecimalField(),
|
112
|
+
'gte': lambda f: forms.DecimalField(),
|
113
|
+
'lt': lambda f: forms.DecimalField(),
|
114
|
+
'lte': lambda f: forms.DecimalField(),
|
115
|
+
'range': lambda f: searchkit_fields.IntegerRangeField(),
|
119
116
|
}
|
120
117
|
),
|
121
118
|
(
|
122
119
|
lambda f: isinstance(f, models.DateTimeField),
|
123
120
|
{
|
124
|
-
'exact':
|
125
|
-
'gt':
|
126
|
-
'gte':
|
127
|
-
'lt':
|
128
|
-
'lte':
|
129
|
-
'range':
|
121
|
+
'exact': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
|
122
|
+
'gt': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
|
123
|
+
'gte': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
|
124
|
+
'lt': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
|
125
|
+
'lte': lambda f: forms.SplitDateTimeField(widget=AdminSplitDateTime()),
|
126
|
+
'range': lambda f: searchkit_fields.DateTimeRangeField(),
|
130
127
|
}
|
131
128
|
),
|
132
129
|
(
|
133
130
|
lambda f: isinstance(f, models.DateField),
|
134
131
|
{
|
135
|
-
'exact':
|
136
|
-
'gt':
|
137
|
-
'gte':
|
138
|
-
'lt':
|
139
|
-
'lte':
|
140
|
-
'range':
|
132
|
+
'exact': lambda f: forms.DateField(widget=AdminDateWidget()),
|
133
|
+
'gt': lambda f: forms.DateField(widget=AdminDateWidget()),
|
134
|
+
'gte': lambda f: forms.DateField(widget=AdminDateWidget()),
|
135
|
+
'lt': lambda f: forms.DateField(widget=AdminDateWidget()),
|
136
|
+
'lte': lambda f: forms.DateField(widget=AdminDateWidget()),
|
137
|
+
'range': lambda f: searchkit_fields.DateRangeField(),
|
141
138
|
}
|
142
139
|
),
|
143
140
|
))
|
@@ -155,24 +152,3 @@ class MediaMixin:
|
|
155
152
|
'admin/js/jquery.init.js',
|
156
153
|
"searchkit/searchkit.js"
|
157
154
|
]
|
158
|
-
|
159
|
-
|
160
|
-
def is_searchable_model(model):
|
161
|
-
"""
|
162
|
-
Check if the model is searchable by Searchkit.
|
163
|
-
"""
|
164
|
-
return admin.site.is_registered(model) and SearchkitFilter in admin.site._registry[model].list_filter
|
165
|
-
|
166
|
-
|
167
|
-
def get_searchable_models():
|
168
|
-
"""
|
169
|
-
Return a queryset of searchable models.
|
170
|
-
"""
|
171
|
-
# Before mirating the database we get an OperationalError when trying to
|
172
|
-
# access ContentType database table.
|
173
|
-
try:
|
174
|
-
models = [m for m in apps.get_models() if is_searchable_model(m)]
|
175
|
-
ids = [ContentType.objects.get_for_model(m).id for m in models]
|
176
|
-
return ContentType.objects.filter(pk__in=ids).order_by('app_label', 'model')
|
177
|
-
except OperationalError:
|
178
|
-
return ContentType.objects.all()
|
searchkit/models.py
CHANGED
@@ -19,9 +19,3 @@ class Search(models.Model):
|
|
19
19
|
for data in self.data:
|
20
20
|
lookups[f'{data["field"]}__{data["operator"]}'] = data['value']
|
21
21
|
return lookups
|
22
|
-
|
23
|
-
def as_queryset(self):
|
24
|
-
"""
|
25
|
-
Returns a filtered queryset for the model.
|
26
|
-
"""
|
27
|
-
return self.contenttype.model_class().objects.filter(**self.as_lookups())
|
searchkit/tests.py
CHANGED
@@ -49,7 +49,7 @@ INITIAL_DATA = [
|
|
49
49
|
dict(
|
50
50
|
field='datetime',
|
51
51
|
operator='exact',
|
52
|
-
value='2025-05-14 08:45',
|
52
|
+
value=['2025-05-14', '08:45'],
|
53
53
|
)
|
54
54
|
]
|
55
55
|
|
@@ -263,8 +263,6 @@ class SearchkitSearchFormTestCase(TestCase):
|
|
263
263
|
self.assertEqual(len(filter_rules), len(INITIAL_DATA))
|
264
264
|
for data in INITIAL_DATA:
|
265
265
|
self.assertIn(f"{data['field']}__{data['operator']}", filter_rules)
|
266
|
-
queryset = form.instance.as_queryset()
|
267
|
-
self.assertTrue(queryset.model == ModelA)
|
268
266
|
|
269
267
|
|
270
268
|
class SearchkitModelFormTestCase(TestCase):
|
searchkit/utils.py
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
from django.contrib import admin
|
2
|
+
|
3
|
+
|
4
|
+
def is_searchable_model(model):
|
5
|
+
"""
|
6
|
+
Check if the model is searchable by Searchkit.
|
7
|
+
"""
|
8
|
+
# We do not import SearchkitFilter to avoid circular imports. So we check
|
9
|
+
# the filter by its name.
|
10
|
+
return (
|
11
|
+
admin.site.is_registered(model)
|
12
|
+
and 'SearchkitFilter' in [getattr(f, '__name__', '') for f in admin.site._registry[model].list_filter]
|
13
|
+
)
|
searchkit/views.py
CHANGED
@@ -14,9 +14,9 @@ class SearchkitAjaxView(View):
|
|
14
14
|
Reload the formset via ajax.
|
15
15
|
"""
|
16
16
|
def get(self, request, **kwargs):
|
17
|
-
|
18
|
-
if
|
19
|
-
model =
|
17
|
+
model_form = SearchkitModelForm(data=self.request.GET)
|
18
|
+
if model_form.is_valid():
|
19
|
+
model = model_form.cleaned_data['searchkit_model'].model_class()
|
20
20
|
formset = searchkit_formset_factory(model=model)(data=request.GET)
|
21
21
|
return HttpResponse(formset.render())
|
22
22
|
else:
|
@@ -1,99 +0,0 @@
|
|
1
|
-
build/lib/build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
-
build/lib/build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
|
3
|
-
build/lib/build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
|
4
|
-
build/lib/build/lib/example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
|
5
|
-
build/lib/build/lib/example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
|
6
|
-
build/lib/build/lib/example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
|
7
|
-
build/lib/build/lib/example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
|
8
|
-
build/lib/build/lib/example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
-
build/lib/build/lib/example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
-
build/lib/build/lib/example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
|
11
|
-
build/lib/build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
|
12
|
-
build/lib/build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
-
build/lib/build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
14
|
-
build/lib/build/lib/searchkit/__version__.py,sha256=YHc4yqTXD8EGEgS4jTIrg3vbI45fTQWhAF19GPsIcZM,661
|
15
|
-
build/lib/build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
|
16
|
-
build/lib/build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
|
17
|
-
build/lib/build/lib/searchkit/filters.py,sha256=z3L2bWIk-LRWwW_95JwZk14fjtOnsBqXI8LZx3foV-0,1135
|
18
|
-
build/lib/build/lib/searchkit/models.py,sha256=G3kCU_bsLVzcToKgk1Gbh_8B3FCw3KofFubyddaxTUU,985
|
19
|
-
build/lib/build/lib/searchkit/tests.py,sha256=p_YHEVNo9JbpwdIk_8Hz6yda2ei-ALTKRIK7IaKii6g,14946
|
20
|
-
build/lib/build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
|
21
|
-
build/lib/build/lib/searchkit/views.py,sha256=EvCJOsxackQAzk3-uc6V4cmgEqkS-f2ZVBVRmXoMukA,937
|
22
|
-
build/lib/build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
|
23
|
-
build/lib/build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
|
24
|
-
build/lib/build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
|
25
|
-
build/lib/build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
|
26
|
-
build/lib/build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
|
27
|
-
build/lib/build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
|
28
|
-
build/lib/build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
|
29
|
-
build/lib/build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
30
|
-
build/lib/build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
31
|
-
build/lib/build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
|
32
|
-
build/lib/example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
33
|
-
build/lib/example/example/admin.py,sha256=eTZ5mCA1ToGouqYgIf-6xDl2nvYAz7T9lU1Bnu_gP9c,462
|
34
|
-
build/lib/example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
|
35
|
-
build/lib/example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
|
36
|
-
build/lib/example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
|
37
|
-
build/lib/example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
|
38
|
-
build/lib/example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
|
39
|
-
build/lib/example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
40
|
-
build/lib/example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
41
|
-
build/lib/example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
|
42
|
-
build/lib/example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
|
43
|
-
build/lib/example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
44
|
-
build/lib/searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
45
|
-
build/lib/searchkit/__version__.py,sha256=YHc4yqTXD8EGEgS4jTIrg3vbI45fTQWhAF19GPsIcZM,661
|
46
|
-
build/lib/searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
|
47
|
-
build/lib/searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
|
48
|
-
build/lib/searchkit/filters.py,sha256=z3L2bWIk-LRWwW_95JwZk14fjtOnsBqXI8LZx3foV-0,1135
|
49
|
-
build/lib/searchkit/models.py,sha256=G3kCU_bsLVzcToKgk1Gbh_8B3FCw3KofFubyddaxTUU,985
|
50
|
-
build/lib/searchkit/tests.py,sha256=p_YHEVNo9JbpwdIk_8Hz6yda2ei-ALTKRIK7IaKii6g,14946
|
51
|
-
build/lib/searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
|
52
|
-
build/lib/searchkit/views.py,sha256=EvCJOsxackQAzk3-uc6V4cmgEqkS-f2ZVBVRmXoMukA,937
|
53
|
-
build/lib/searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
|
54
|
-
build/lib/searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
|
55
|
-
build/lib/searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
|
56
|
-
build/lib/searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
|
57
|
-
build/lib/searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
|
58
|
-
build/lib/searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
|
59
|
-
build/lib/searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
|
60
|
-
build/lib/searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
61
|
-
build/lib/searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
62
|
-
build/lib/searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
|
63
|
-
django_searchkit-1.1.dist-info/licenses/LICENCE,sha256=oqmlRYPA5GHG2T1yp8fPFGQdOO-NnJPdGITeFiJYWLg,1521
|
64
|
-
example/example/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
65
|
-
example/example/admin.py,sha256=KDjYyHPEqNdv7Xe8yx0VuWdx-bDn7qKKHM5ZYhFwdU0,445
|
66
|
-
example/example/asgi.py,sha256=mqLnzcCH9X-8UhDo5ZhcM8tF3jtALEGSjsBmphbkLcs,391
|
67
|
-
example/example/models.py,sha256=fB9X782cX01Yg2uIiPCVgrS8C7DkgG9U-9mxGtX3P7Q,1097
|
68
|
-
example/example/settings.py,sha256=du9bWbAceSvDkYeNYOc_3KxKL1p1se93TdAueT2RQ_E,3256
|
69
|
-
example/example/urls.py,sha256=D8LxjiTdJSA87AVh3BzpVo5E2aC30hlp20HshPDrfvU,800
|
70
|
-
example/example/wsgi.py,sha256=OAXHHeNQoj7FBDc5NMET39i_kIGpFrcdNDdY1thrh58,391
|
71
|
-
example/example/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
72
|
-
example/example/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
73
|
-
example/example/management/commands/createtestdata.py,sha256=IVtyUqak133h9Ua-Ag_GP8mw3dUdiDYAa2tGmLkKluU,2737
|
74
|
-
example/example/migrations/0001_initial.py,sha256=62tOi17oHGuqqLmSAYWLep6AMkxCJF6Tp13odghS7gI,2014
|
75
|
-
example/example/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
76
|
-
searchkit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
77
|
-
searchkit/__version__.py,sha256=YHc4yqTXD8EGEgS4jTIrg3vbI45fTQWhAF19GPsIcZM,661
|
78
|
-
searchkit/admin.py,sha256=URZgMKnfKlDqOgmQXJHu7mFGrjwkElpunAUbp2_9JcA,1182
|
79
|
-
searchkit/apps.py,sha256=17m6wPu5N59Dq4MLoWaQd0aNHEzMT4z4emQD632GIMA,150
|
80
|
-
searchkit/filters.py,sha256=z3L2bWIk-LRWwW_95JwZk14fjtOnsBqXI8LZx3foV-0,1135
|
81
|
-
searchkit/models.py,sha256=G3kCU_bsLVzcToKgk1Gbh_8B3FCw3KofFubyddaxTUU,985
|
82
|
-
searchkit/tests.py,sha256=p_YHEVNo9JbpwdIk_8Hz6yda2ei-ALTKRIK7IaKii6g,14946
|
83
|
-
searchkit/urls.py,sha256=Mhrq4CUOhrh28ZhRocSP2AYnfWFW2c_eJyMR81q5fps,162
|
84
|
-
searchkit/views.py,sha256=EvCJOsxackQAzk3-uc6V4cmgEqkS-f2ZVBVRmXoMukA,937
|
85
|
-
searchkit/forms/__init__.py,sha256=FBggDa1owkYrceIU3cqNhqsMB49RJWZRAkA4OfvUMcM,207
|
86
|
-
searchkit/forms/fields.py,sha256=TpFZdAyWKaMhOoZFTuy5ODNrW6RLy289Lk1fcMSGJ20,1621
|
87
|
-
searchkit/forms/search.py,sha256=mca67piLDqKUhXzaKIOztk5Gg8V1XL21n27aIffH88A,2330
|
88
|
-
searchkit/forms/searchkit.py,sha256=pg3vw6dMdtaHja-g1Yh72XJkLp7I48nXht9zxWbGW9Y,6022
|
89
|
-
searchkit/forms/utils.py,sha256=m8vwB-3AoYuMx0QxlJTwSWbDHBG8MyCxFmsyK6xyai8,5221
|
90
|
-
searchkit/migrations/0001_initial.py,sha256=cP886X1UMrDTf-KxfHfuoQ4b1T1lhdNJyVNOGMNyWNw,1093
|
91
|
-
searchkit/migrations/0002_rename_searchkitsearch_search.py,sha256=RHXShizf689AdPb2Ca-hONWmwZbB2Fs5DQhXlEPE-f0,389
|
92
|
-
searchkit/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
93
|
-
searchkit/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
94
|
-
searchkit/templatetags/searchkit.py,sha256=HpEGTGYi_enDh_bgTgWdVbZftNuZqRt4J9N5A0Nc1AM,581
|
95
|
-
django_searchkit-1.1.dist-info/METADATA,sha256=oFRweWx1Rxx8Nshj_rrsoGCbLkAk_JIGoBzFYjQT-ew,3325
|
96
|
-
django_searchkit-1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
97
|
-
django_searchkit-1.1.dist-info/top_level.txt,sha256=-4gF42VIaG-ckn2rb2wFa7LhxIZymHBsYVedNOr_NIY,29
|
98
|
-
django_searchkit-1.1.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
99
|
-
django_searchkit-1.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|