django-pfx 1.3.dev12__tar.gz → 1.3.dev16__tar.gz

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.
Files changed (130) hide show
  1. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/PKG-INFO +1 -2
  2. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/django_pfx.egg-info/PKG-INFO +1 -2
  3. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/django_pfx.egg-info/requires.txt +0 -1
  4. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/filters_views.py +10 -15
  5. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/rest_views.py +1 -0
  6. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/setup.cfg +0 -1
  7. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/basic_api_test.py +9 -0
  8. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/views.py +2 -1
  9. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/.gitignore +0 -0
  10. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/.gitlab-ci.yml +0 -0
  11. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/.pre-commit-config.yaml +0 -0
  12. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/LICENSE +0 -0
  13. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/MANIFEST.in +0 -0
  14. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/README.md +0 -0
  15. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/django-admin-test +0 -0
  16. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/django_pfx.egg-info/SOURCES.txt +0 -0
  17. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/django_pfx.egg-info/dependency_links.txt +0 -0
  18. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/django_pfx.egg-info/top_level.txt +0 -0
  19. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/Makefile +0 -0
  20. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/conf.py +0 -0
  21. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/index.rst +0 -0
  22. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/api.views.rst +0 -0
  23. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/authentication.md +0 -0
  24. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/decorator.md +0 -0
  25. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/generate_openapi.md +0 -0
  26. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/getting_started.md +0 -0
  27. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/internationalisation.md +0 -0
  28. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/model.md +0 -0
  29. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/pfx_views.md +0 -0
  30. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/profiling.md +0 -0
  31. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/settings.md +0 -0
  32. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/doc/source/testing.md +0 -0
  33. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/img/pfx.png +0 -0
  34. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/img/pfx.svg +0 -0
  35. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/__init__.py +0 -0
  36. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/__init__.py +0 -0
  37. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/apidoc/__init__.py +0 -0
  38. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/apidoc/parameters.py +0 -0
  39. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/apidoc/schema.py +0 -0
  40. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/apidoc/tags.py +0 -0
  41. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/apps.py +0 -0
  42. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/decorator/__init__.py +0 -0
  43. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/decorator/rest.py +0 -0
  44. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/default_settings.py +0 -0
  45. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/exceptions.py +0 -0
  46. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/fields.py +0 -0
  47. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/http/__init__.py +0 -0
  48. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/http/json_response.py +0 -0
  49. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.mo +0 -0
  50. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/locale/fr/LC_MESSAGES/django.po +0 -0
  51. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/management/__init__.py +0 -0
  52. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/management/commands/__init__.py +0 -0
  53. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/management/commands/makeapidoc.py +0 -0
  54. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/management/commands/profile.py +0 -0
  55. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/middleware/__init__.py +0 -0
  56. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/middleware/authentication.py +0 -0
  57. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/middleware/locale.py +0 -0
  58. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/middleware/profiling.py +0 -0
  59. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/models/__init__.py +0 -0
  60. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/models/cache_mixins.py +0 -0
  61. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/models/not_null_fields.py +0 -0
  62. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/models/pfx_models.py +0 -0
  63. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/models/user_filtered_queryset_mixin.py +0 -0
  64. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/serializers/__init__.py +0 -0
  65. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/serializers/json.py +0 -0
  66. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/settings.py +0 -0
  67. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/shortcuts.py +0 -0
  68. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/storage/__init__.py +0 -0
  69. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/storage/s3_storage.py +0 -0
  70. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/templates/registration/password_reset_email.txt +0 -0
  71. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/templates/registration/password_reset_subject.txt +0 -0
  72. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/templates/registration/welcome_email.txt +0 -0
  73. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/templates/registration/welcome_subject.txt +0 -0
  74. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/test.py +0 -0
  75. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/urls.py +0 -0
  76. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/__init__.py +0 -0
  77. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/authentication_views.py +0 -0
  78. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/fields.py +0 -0
  79. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/locale_views.py +0 -0
  80. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/__init__.py +0 -0
  81. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/date_format.py +0 -0
  82. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/groups.py +0 -0
  83. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/list_count.py +0 -0
  84. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/list_items.py +0 -0
  85. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/list_mode.py +0 -0
  86. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/list_order.py +0 -0
  87. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/list_search.py +0 -0
  88. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/media_redirect.py +0 -0
  89. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/meta_fields.py +0 -0
  90. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/meta_filters.py +0 -0
  91. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/meta_orders.py +0 -0
  92. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/subset.py +0 -0
  93. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/subset_limit.py +0 -0
  94. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/subset_offset.py +0 -0
  95. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/subset_page.py +0 -0
  96. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/subset_page_size.py +0 -0
  97. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pfx/pfxcore/views/parameters/subset_page_subset.py +0 -0
  98. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/pyproject.toml +0 -0
  99. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/requirements.txt +0 -0
  100. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/runtest.py +0 -0
  101. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/serve-doc +0 -0
  102. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/setup.py +0 -0
  103. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/__init__.py +0 -0
  104. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/locale/fr/LC_MESSAGES/django.po +0 -0
  105. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/models.py +0 -0
  106. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/settings/__init__.py +0 -0
  107. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/settings/ci.py +0 -0
  108. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/settings/common.py +0 -0
  109. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/settings/dev.py +0 -0
  110. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/settings/dev_custom_example.py +0 -0
  111. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/settings/dev_default.py +0 -0
  112. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/__init__.py +0 -0
  113. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/basic_api_errors.py +0 -0
  114. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_api_doc.py +0 -0
  115. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_auth_api.py +0 -0
  116. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_cache.py +0 -0
  117. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_client.py +0 -0
  118. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_fields.py +0 -0
  119. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_filters.py +0 -0
  120. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_locale_api.py +0 -0
  121. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_perm_tests.py +0 -0
  122. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_perms_api.py +0 -0
  123. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_profiling_middleware.py +0 -0
  124. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_shortcuts.py +0 -0
  125. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_timezone_middleware.py +0 -0
  126. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_tools.py +0 -0
  127. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_user_queryset.py +0 -0
  128. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_view_decorators.py +0 -0
  129. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/tests/test_view_fields.py +0 -0
  130. {django-pfx-1.3.dev12 → django-pfx-1.3.dev16}/tests/urls.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-pfx
3
- Version: 1.3.dev12
3
+ Version: 1.3.dev16
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -27,7 +27,6 @@ Description-Content-Type: text/markdown
27
27
  License-File: LICENSE
28
28
  Requires-Dist: django<5.0,>=4.2
29
29
  Requires-Dist: django-cors-headers
30
- Requires-Dist: django_json_widget
31
30
  Requires-Dist: pyjwt>=2.1
32
31
  Requires-Dist: Babel
33
32
  Requires-Dist: boto3
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-pfx
3
- Version: 1.3.dev12
3
+ Version: 1.3.dev16
4
4
  Summary: Django PFX is a toolkit designed to streamline the development of RESTful APIs using the Django framework.
5
5
  Author: Hervé Martinet
6
6
  Author-email: herve.martinet@gmail.com
@@ -27,7 +27,6 @@ Description-Content-Type: text/markdown
27
27
  License-File: LICENSE
28
28
  Requires-Dist: django<5.0,>=4.2
29
29
  Requires-Dist: django-cors-headers
30
- Requires-Dist: django_json_widget
31
30
  Requires-Dist: pyjwt>=2.1
32
31
  Requires-Dist: Babel
33
32
  Requires-Dist: boto3
@@ -1,6 +1,5 @@
1
1
  django<5.0,>=4.2
2
2
  django-cors-headers
3
- django_json_widget
4
3
  pyjwt>=2.1
5
4
  Babel
6
5
  boto3
@@ -32,7 +32,8 @@ class Filter():
32
32
  def __init__(
33
33
  self, name, label, type=None, filter_func=None,
34
34
  filter_func_and=False, filter_func_list=False, choices=None,
35
- related_model=None, technical=False, defaults=None, ):
35
+ related_model=None, technical=False, defaults=None,
36
+ empty_value=True):
36
37
  self.name = name
37
38
  self.label = label
38
39
  self.type = type
@@ -43,13 +44,16 @@ class Filter():
43
44
  self.related_model = related_model
44
45
  self.technical = technical
45
46
  self.defaults = defaults or []
47
+ self.empty_value = empty_value
46
48
 
47
49
  @property
48
50
  def meta(self):
49
51
  res = dict(
52
+ is_group=False,
50
53
  label=_(self.label),
51
54
  name=self.name,
52
55
  type=self.type,
56
+ empty_value=self.empty_value,
53
57
  technical=self.technical)
54
58
  if self.choices:
55
59
  res['choices'] = [
@@ -89,9 +93,12 @@ class ModelFilter(Filter):
89
93
  def __init__(
90
94
  self, model, name, label=None, type=None,
91
95
  filter_func=None, filter_func_and=False, filter_func_list=False,
92
- choices=None, related_model=None, technical=False, defaults=None):
96
+ choices=None, related_model=None, technical=False, defaults=None,
97
+ empty_value=None):
93
98
  self.model = model
94
99
  self.field = model._meta.get_field(name)
100
+ if empty_value is None:
101
+ empty_value = self.field.blank
95
102
  super().__init__(
96
103
  name, label or self.field.verbose_name,
97
104
  type or self._type_from_model,
@@ -100,7 +107,7 @@ class ModelFilter(Filter):
100
107
  related_model or (
101
108
  self.field.remote_field and
102
109
  self.field.remote_field.model),
103
- technical=technical, defaults=defaults)
110
+ technical=technical, defaults=defaults, empty_value=empty_value)
104
111
 
105
112
  @property
106
113
  def _type_from_model(self):
@@ -112,18 +119,6 @@ class ModelFilter(Filter):
112
119
  return FieldType.ModelObject
113
120
  return model_type
114
121
 
115
- @property
116
- def meta(self):
117
- res = dict(
118
- is_group=False, label=_(self.label), name=self.name,
119
- type=self.type, technical=self.technical)
120
- if self.choices:
121
- res['choices'] = [
122
- dict(label=_(v), value=k) for k, v in self.choices]
123
- if self.related_model:
124
- res['related_model'] = str(self.related_model.__name__)
125
- return res
126
-
127
122
  def query(self, params):
128
123
  values = self._get_values(params)
129
124
  if self.filter_func and values:
@@ -831,6 +831,7 @@ class ListRestViewMixin(ModelResponseMixin):
831
831
  choices=dict(
832
832
  type='array', items=dict(type='string'),
833
833
  example=["value1", "value2"]),
834
+ empty_value=dict(type='boolean'),
834
835
  technical=dict(type='boolean'),
835
836
  related_model=dict(type='string'))),
836
837
  description="List of fields."),
@@ -33,7 +33,6 @@ include_package_data = true
33
33
  install_requires =
34
34
  django>=4.2,<5.0
35
35
  django-cors-headers
36
- django_json_widget
37
36
  pyjwt>=2.1
38
37
  Babel
39
38
  boto3
@@ -203,6 +203,7 @@ class BasicAPITest(TestAssertMixin, TestCase):
203
203
  self.assertJE(response, 'filters.@0.name', 'book_type')
204
204
  self.assertJE(response, 'filters.@0.items', [
205
205
  {
206
+ 'empty_value': False,
206
207
  "is_group": False,
207
208
  "label": "Science Fiction",
208
209
  "name": "science_fiction",
@@ -210,12 +211,15 @@ class BasicAPITest(TestAssertMixin, TestCase):
210
211
  "type": "BooleanField"
211
212
  },
212
213
  {
214
+ 'empty_value': True,
215
+ "is_group": False,
213
216
  "label": "Heroic Fantasy",
214
217
  "name": "heroic_fantasy",
215
218
  "technical": False,
216
219
  "type": "BooleanField"
217
220
  },
218
221
  {
222
+ 'empty_value': False,
219
223
  "is_group": False,
220
224
  "label": "Types",
221
225
  "name": "types",
@@ -227,6 +231,7 @@ class BasicAPITest(TestAssertMixin, TestCase):
227
231
  self.assertJE(response, 'filters.@1.name', 'custom')
228
232
  self.assertJE(response, 'filters.@1.items', [
229
233
  {
234
+ 'empty_value': False,
230
235
  "is_group": False,
231
236
  "label": "Last Name",
232
237
  "name": "last_name",
@@ -234,6 +239,7 @@ class BasicAPITest(TestAssertMixin, TestCase):
234
239
  "type": "BooleanField"
235
240
  },
236
241
  {
242
+ 'empty_value': False,
237
243
  "is_group": False,
238
244
  "label": "First Name",
239
245
  "name": "first_name",
@@ -251,6 +257,7 @@ class BasicAPITest(TestAssertMixin, TestCase):
251
257
  "value": "female"
252
258
  }
253
259
  ],
260
+ 'empty_value': False,
254
261
  "is_group": False,
255
262
  "label": "Gender",
256
263
  "name": "gender",
@@ -268,6 +275,8 @@ class BasicAPITest(TestAssertMixin, TestCase):
268
275
  "value": "Asimov"
269
276
  }
270
277
  ],
278
+ 'empty_value': False,
279
+ "is_group": False,
271
280
  "label": "Tolkien or Asimov",
272
281
  "name": "last_name_choices",
273
282
  "technical": False,
@@ -75,7 +75,8 @@ class AuthorRestView(AuthorRestViewMixin, SlugDetailRestViewMixin, RestView):
75
75
  Filter(
76
76
  'last_name_choices', _("Tolkien or Asimov"),
77
77
  FieldType.CharField, last_name_choices_filter,
78
- choices=[('Tolkien', "Tolkien"), ('Asimov', "Asimov")]),
78
+ choices=[('Tolkien', "Tolkien"), ('Asimov', "Asimov")],
79
+ empty_value=False),
79
80
  ]),
80
81
  ]
81
82
 
File without changes
File without changes
File without changes
File without changes