django-unfold 0.68.0__tar.gz → 0.69.0__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 (324) hide show
  1. {django_unfold-0.68.0 → django_unfold-0.69.0}/PKG-INFO +31 -42
  2. {django_unfold-0.68.0 → django_unfold-0.69.0}/README.md +30 -41
  3. {django_unfold-0.68.0 → django_unfold-0.69.0}/pyproject.toml +1 -1
  4. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/admin.py +8 -37
  5. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/datasets.py +22 -1
  6. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/forms.py +22 -15
  7. django_unfold-0.69.0/src/unfold/mixins/__init__.py +5 -0
  8. django_unfold-0.69.0/src/unfold/mixins/dataset_model_admin.py +62 -0
  9. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/settings.py +1 -0
  10. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/sites.py +5 -1
  11. django_unfold-0.69.0/src/unfold/static/admin/js/actions.js +246 -0
  12. django_unfold-0.69.0/src/unfold/static/unfold/css/styles.css +2 -0
  13. django_unfold-0.69.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  14. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/actions.html +2 -2
  15. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_form.html +8 -4
  16. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_list.html +1 -1
  17. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_list_results.html +1 -1
  18. django_unfold-0.69.0/src/unfold/templates/admin/dataset_actions.html +50 -0
  19. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/edit_inline/stacked.html +1 -7
  20. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/edit_inline/tabular.html +1 -7
  21. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/includes/fieldset.html +1 -3
  22. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/search_form.html +1 -1
  23. django_unfold-0.69.0/src/unfold/templates/registration/password_change_done.html +11 -0
  24. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/registration/password_change_form.html +10 -6
  25. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_actions.html +1 -1
  26. django_unfold-0.69.0/src/unfold/templates/unfold/helpers/dataset.html +31 -0
  27. django_unfold-0.69.0/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +24 -0
  28. django_unfold-0.69.0/src/unfold/templates/unfold/helpers/inline_heading.html +11 -0
  29. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_items.html +6 -4
  30. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templatetags/unfold.py +47 -70
  31. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templatetags/unfold_list.py +12 -0
  32. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/widgets.py +1 -2
  33. django_unfold-0.68.0/src/unfold/mixins/__init__.py +0 -4
  34. django_unfold-0.68.0/src/unfold/static/unfold/css/styles.css +0 -2
  35. django_unfold-0.68.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
  36. django_unfold-0.68.0/src/unfold/templates/registration/password_change_done.html +0 -12
  37. django_unfold-0.68.0/src/unfold/templates/unfold/helpers/dataset.html +0 -19
  38. django_unfold-0.68.0/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -26
  39. {django_unfold-0.68.0 → django_unfold-0.69.0}/LICENSE.md +0 -0
  40. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/__init__.py +0 -0
  41. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/apps.py +0 -0
  42. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/checks.py +0 -0
  43. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/components.py +0 -0
  44. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/__init__.py +0 -0
  45. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/__init__.py +0 -0
  46. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/apps.py +0 -0
  47. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/settings.py +0 -0
  48. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/templates/admin/constance/change_list.html +0 -0
  49. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/templates/admin/constance/includes/results_list.html +0 -0
  50. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/__init__.py +0 -0
  51. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/__init__.py +0 -0
  52. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/autocomplete_filters.py +0 -0
  53. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/choice_filters.py +0 -0
  54. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/datetime_filters.py +0 -0
  55. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/dropdown_filters.py +0 -0
  56. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/mixins.py +0 -0
  57. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/numeric_filters.py +0 -0
  58. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/text_filters.py +0 -0
  59. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/apps.py +0 -0
  60. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/forms.py +0 -0
  61. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider/LICENSE +0 -0
  62. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider/nouislider.min.css +0 -0
  63. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
  64. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
  65. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider/LICENSE +0 -0
  66. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider/nouislider.min.js +0 -0
  67. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/wnumb/LICENSE +0 -0
  68. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/wnumb/wNumb.min.js +0 -0
  69. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +0 -0
  70. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +0 -0
  71. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
  72. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
  73. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
  74. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
  75. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/__init__.py +0 -0
  76. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/apps.py +0 -0
  77. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix/LICENSE +0 -0
  78. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix/trix.css +0 -0
  79. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix/LICENSE +0 -0
  80. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix/trix.js +0 -0
  81. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
  82. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
  83. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
  84. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
  85. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/widgets.py +0 -0
  86. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/__init__.py +0 -0
  87. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/apps.py +0 -0
  88. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
  89. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
  90. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
  91. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_group.html +0 -0
  92. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage_user.html +0 -0
  93. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
  94. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
  95. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/__init__.py +0 -0
  96. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/apps.py +0 -0
  97. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/forms.py +0 -0
  98. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
  99. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
  100. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export.html +0 -0
  101. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_export_item.html +0 -0
  102. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import.html +0 -0
  103. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_export.html +0 -0
  104. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_list_import_item.html +0 -0
  105. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
  106. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
  107. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
  108. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
  109. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
  110. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
  111. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
  112. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/resource_fields_list.html +0 -0
  113. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/__init__.py +0 -0
  114. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/admin.py +0 -0
  115. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/apps.py +0 -0
  116. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/checks.py +0 -0
  117. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/forms.py +0 -0
  118. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/location_field/__init__.py +0 -0
  119. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/location_field/apps.py +0 -0
  120. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/location_field/templates/location_field/map_widget.html +0 -0
  121. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
  122. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/apps.py +0 -0
  123. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
  124. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
  125. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
  126. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
  127. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/dataclasses.py +0 -0
  128. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/decorators.py +0 -0
  129. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/enums.py +0 -0
  130. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/exceptions.py +0 -0
  131. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/fields.py +0 -0
  132. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/layout.py +0 -0
  133. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/mixins/action_model_admin.py +0 -0
  134. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/mixins/base_model_admin.py +0 -0
  135. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/overrides.py +0 -0
  136. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/paginator.py +0 -0
  137. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/sections.py +0 -0
  138. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +0 -0
  139. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/admin/js/inlines.js +0 -0
  140. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/css/simplebar/LICENSE +0 -0
  141. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/css/simplebar/simplebar.css +0 -0
  142. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
  143. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
  144. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
  145. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
  146. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/LICENSE +0 -0
  147. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
  148. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/material-symbols/LICENSE +0 -0
  149. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
  150. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/LICENSE +0 -0
  151. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.anchor.js +0 -0
  152. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.js +0 -0
  153. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.persist.js +0 -0
  154. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.resize.js +0 -0
  155. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.sort.js +0 -0
  156. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/app.js +0 -0
  157. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/chart/LICENSE +0 -0
  158. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/chart/chart.js +0 -0
  159. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/htmx/LICENSE +0 -0
  160. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/htmx/htmx.js +0 -0
  161. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/select2.init.js +0 -0
  162. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/simplebar/LICENSE +0 -0
  163. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/simplebar/simplebar.js +0 -0
  164. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/styles.css +0 -0
  165. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/app_index.html +0 -0
  166. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/app_list.html +0 -0
  167. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
  168. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
  169. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/base.html +0 -0
  170. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/base_site.html +0 -0
  171. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
  172. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
  173. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
  174. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
  175. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
  176. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/filter.html +0 -0
  177. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
  178. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/index.html +0 -0
  179. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/login.html +0 -0
  180. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
  181. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/object_history.html +0 -0
  182. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/pagination.html +0 -0
  183. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/submit_line.html +0 -0
  184. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
  185. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/registration/logged_out.html +0 -0
  186. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/button.html +0 -0
  187. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/card.html +0 -0
  188. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
  189. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/chart/cohort.html +0 -0
  190. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
  191. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/container.html +0 -0
  192. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/flex.html +0 -0
  193. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/icon.html +0 -0
  194. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/layer.html +0 -0
  195. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
  196. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/progress.html +0 -0
  197. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/separator.html +0 -0
  198. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/table.html +0 -0
  199. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/text.html +0 -0
  200. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/title.html +0 -0
  201. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/tracker.html +0 -0
  202. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
  203. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
  204. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
  205. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
  206. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
  207. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
  208. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
  209. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
  210. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_filter.html +0 -0
  211. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +0 -0
  212. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_headers.html +0 -0
  213. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/command.html +0 -0
  214. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/command_history.html +0 -0
  215. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/command_results.html +0 -0
  216. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/delete_submit_line.html +0 -0
  217. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/display_dropdown.html +0 -0
  218. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
  219. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
  220. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +0 -0
  221. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_error.html +0 -0
  222. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_field.html +0 -0
  223. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +0 -0
  224. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_row.html +0 -0
  225. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_title.html +0 -0
  226. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/empty_results.html +0 -0
  227. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field.html +0 -0
  228. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
  229. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
  230. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field_readonly_value_file.html +0 -0
  231. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
  232. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/fieldset_row_checkbox.html +0 -0
  233. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/fieldset_row_field.html +0 -0
  234. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
  235. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/form_label.html +0 -0
  236. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
  237. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/header_back_button.html +0 -0
  238. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/header_title.html +0 -0
  239. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
  240. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
  241. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
  242. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/language_form.html +0 -0
  243. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/language_switch.html +0 -0
  244. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/debug.html +0 -0
  245. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
  246. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
  247. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
  248. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/success.html +0 -0
  249. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/warning.html +0 -0
  250. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
  251. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
  252. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/navigation_header.html +0 -0
  253. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination.html +0 -0
  254. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
  255. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_default.html +0 -0
  256. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
  257. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_infinite.html +0 -0
  258. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_inline.html +0 -0
  259. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/popup_header.html +0 -0
  260. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
  261. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
  262. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/shortcut.html +0 -0
  263. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_branding.html +0 -0
  264. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_dropdown.html +0 -0
  265. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
  266. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
  267. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
  268. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_action.html +0 -0
  269. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_actions.html +0 -0
  270. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
  271. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
  272. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/unauthenticated_header.html +0 -0
  273. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/unauthenticated_title.html +0 -0
  274. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
  275. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
  276. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
  277. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
  278. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
  279. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/unauthenticated.html +0 -0
  280. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/templatetags/preserve_changelist_filters.html +0 -0
  281. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +0 -0
  282. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +0 -0
  283. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
  284. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
  285. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
  286. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/radio_option.html +0 -0
  287. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
  288. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
  289. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/select.html +0 -0
  290. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
  291. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
  292. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
  293. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/text.html +0 -0
  294. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
  295. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
  296. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
  297. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/display_form.html +0 -0
  298. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/errors.html +0 -0
  299. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/errors_formset.html +0 -0
  300. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/field.html +0 -0
  301. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/inputs.html +0 -0
  302. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/attrs.html +0 -0
  303. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/baseinput.html +0 -0
  304. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/button.html +0 -0
  305. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/buttonholder.html +0 -0
  306. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/checkbox.html +0 -0
  307. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/column.html +0 -0
  308. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/div.html +0 -0
  309. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/field_errors.html +0 -0
  310. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/fieldset.html +0 -0
  311. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/fieldset_subheader.html +0 -0
  312. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/help_text.html +0 -0
  313. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/help_text_and_errors.html +0 -0
  314. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/hr.html +0 -0
  315. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/radio_checkbox_select.html +0 -0
  316. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/row.html +0 -0
  317. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/table_inline_formset.html +0 -0
  318. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/uni_form.html +0 -0
  319. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/whole_uni_form.html +0 -0
  320. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/whole_uni_formset.html +0 -0
  321. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templatetags/__init__.py +0 -0
  322. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/typing.py +0 -0
  323. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/utils.py +0 -0
  324. {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-unfold
3
- Version: 0.68.0
3
+ Version: 0.69.0
4
4
  Summary: Modern Django admin theme for seamless interface development
5
5
  License: MIT
6
6
  License-File: LICENSE.md
@@ -33,7 +33,7 @@ Description-Content-Type: text/markdown
33
33
  ![Pre Commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge)
34
34
  ![Code Style - Ruff](https://img.shields.io/badge/code%20style-ruff-30173D.svg?style=for-the-badge)
35
35
 
36
- Transform your Django admin into a powerful, modern administrative interface with Unfold. This open-source theme enhances Django's default admin with beautiful design, advanced features, and developer-friendly customization options. Built on proven best practices, Unfold seamlessly integrates with your existing Django admin while providing all the tools needed to create sophisticated administrative areas that both developers and end-users will love.
36
+ Modern theme that upgrades Django admin with beautiful design, advanced features, and easy customization.
37
37
 
38
38
  - **Documentation:** The full documentation is available at [unfoldadmin.com](https://unfoldadmin.com?utm_medium=github&utm_source=unfold).
39
39
  - **Unfold:** The demo site is available at [unfoldadmin.com](https://unfoldadmin.com?utm_medium=github&utm_source=unfold).
@@ -41,60 +41,49 @@ Transform your Django admin into a powerful, modern administrative interface wit
41
41
  - **Turbo:** A Django & Next.js boilerplate implementing Unfold is available at [github.com/unfoldadmin/turbo](https://github.com/unfoldadmin/turbo?utm_medium=github&utm_source=unfold).
42
42
  - **Discord:** Join our Unfold community on [Discord](https://discord.gg/9sQj9MEbNz).
43
43
 
44
- ## Profesional tools & services
44
+ ## Profesional services
45
45
 
46
- Looking for professional help with your Django or Unfold project? We offer a range of tools and services to support your development process:
46
+ Need expert help with Django or Unfold? We offer services to support your project:
47
47
 
48
- ### Consulting services
48
+ - **Consulting**: Expert guidance on Django architecture, performance, feature development, and Unfold integration. [Learn more](https://unfoldadmin.com/consulting/?utm_medium=github&utm_source=unfold)
49
+ - **Support**: Assistance with integrating or customizing Unfold, including live 1:1 calls and implementation review. Fixed price, no ongoing commitment. [Learn more](https://unfoldadmin.com/support/?utm_medium=github&utm_source=unfold)
50
+ - **Studio**: Visually customize Django admin with own color schemes. Access a variety of dashboard templates, a password reset flow, and more. [Learn more](https://unfoldadmin.com/studio?utm_medium=github&utm_source=unfold)
49
51
 
50
- Professional consulting services for Django applications — from architecture and performance optimization to feature development and Unfold integration.
51
- Ideal for teams looking to scale, modernize, or customize their Django projects with expert support. Learn more at [unfoldadmin.com/consulting](https://unfoldadmin.com/consulting/?utm_medium=github&utm_source=unfold).
52
+ [![dashboards](https://github.com/user-attachments/assets/7c3124ab-2f59-4254-9222-8a57970f51a6)](https://unfoldadmin.com/studio?utm_medium=github&utm_source=unfold)
52
53
 
53
- ### Support package
54
+ ## Latest improvements
54
55
 
55
- If you need assistance with integrating or customizing Unfold, support packages are available. They include live 1:1 calls, implementation review, and ongoing Discord-based support fixed price, no ongoing commitment. Learn more at [unfoldadmin.com/support](https://unfoldadmin.com/support/?utm_medium=github&utm_source=unfold).
56
+ - **Datasets**: Display custom changelists on change form detail pages.
57
+ - **Command**: Offers a command palette for quick searching across all models or custom-injected data.
58
+ - **Constance**: Official `django-constance` support with a completely new design and UX improvements.
56
59
 
57
- ### Unfold Studio
60
+ ## Core features
58
61
 
59
- Unfold Studio lets you visually customize your Django admin without writing code — update colors, logos, sidebar, and interface styles to match your brand in minutes. Give your admin a polished, professional look that feels truly yours. Available at [unfoldadmin.com/studio](https://unfoldadmin.com/studio).
60
-
61
- [![dashboards](https://github.com/user-attachments/assets/7c3124ab-2f59-4254-9222-8a57970f51a6)](https://unfoldadmin.com/studio)
62
-
63
-
64
- ## Fresh Features & Enhancements
65
-
66
- - **Command**: Offers a command palette for quick searching across all models or custom-injected data
67
- - **django-constance**: Official support with a completely new design and UX improvements
68
- - **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance
69
- - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
70
- - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
71
-
72
- ## Core Features & Capabilities
73
-
74
- - **Visual Interface**: Provides a modern user interface based on the Tailwind CSS framework.
62
+ - **Visual interface**: Provides a modern user interface based on the Tailwind CSS framework.
75
63
  - **Sidebar navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
76
64
  - **Dark mode support**: Includes both light and dark mode themes.
77
65
  - **Flexible actions**: Provides multiple ways to define actions throughout the admin interface.
78
66
  - **Advanced filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
79
67
  - **Dashboard tools**: Includes helpers for building custom dashboard pages.
80
68
  - **UI components**: Offers reusable interface components such as cards, buttons, and charts.
81
- - **Crispy forms**: Custom template pack for django-crispy-forms to style forms with Unfold's design system
69
+ - **Crispy forms**: Custom template pack for django-crispy-forms to style forms with Unfold's design system.
82
70
  - **WYSIWYG editor**: Built-in support for WYSIWYG editing through Trix.
83
- - **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`
84
- - **Inline tabs:** Group inlines into tab navigation in the change form
85
- - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
86
- - **Model tabs:** Allow defining custom tab navigation for models
87
- - **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form
88
- - **Sortable inlines:** Allow sorting inlines by dragging and dropping
89
- - **Command**: Offers a command palette for quick searching across all models or custom-injected data
90
- - **Environment label:** Distinguish between environments by displaying a label
91
- - **Nonrelated inlines:** Display nonrelated models as inlines in the change form
92
- - **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance
93
- - **Favicons:** Built-in support for configuring various site favicons
94
- - **Themes:** Allow customization of color scheme, background color, border radius, and more
95
- - **Font colors:** Adjust font colors for better readability
96
- - **Changeform modes:** Display fields in compressed mode in the change form
97
- - **Language switcher:** Allow changing language directly from the admin area
71
+ - **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`.
72
+ - **Inline tabs:** Group inlines into tab navigation in the change form.
73
+ - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form.
74
+ - **Model tabs:** Allow defining custom tab navigation for models.
75
+ - **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form.
76
+ - **Sortable inlines:** Allow sorting inlines by dragging and dropping.
77
+ - **Command**: Offers a command palette for quick searching across all models or custom-injected data.
78
+ - **Datasets**: Custom changelists `ModelAdmin` displayed on change form detail pages.
79
+ - **Environment label:** Distinguish between environments by displaying a label.
80
+ - **Nonrelated inlines:** Display nonrelated models as inlines in the change form.
81
+ - **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance.
82
+ - **Favicons:** Built-in support for configuring various site favicons.
83
+ - **Themes:** Allow customization of color scheme, background color, border radius, and more.
84
+ - **Font colors:** Adjust font colors for better readability.
85
+ - **Changeform modes:** Display fields in compressed mode in the change form.
86
+ - **Language switcher:** Allow changing language directly from the admin area.
98
87
  - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
99
88
  - **Parallel admin:** Supports [running the default admin](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold) alongside Unfold.
100
89
  - **Third-party packages:** Provides default support for multiple popular applications.
@@ -8,7 +8,7 @@
8
8
  ![Pre Commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white&style=for-the-badge)
9
9
  ![Code Style - Ruff](https://img.shields.io/badge/code%20style-ruff-30173D.svg?style=for-the-badge)
10
10
 
11
- Transform your Django admin into a powerful, modern administrative interface with Unfold. This open-source theme enhances Django's default admin with beautiful design, advanced features, and developer-friendly customization options. Built on proven best practices, Unfold seamlessly integrates with your existing Django admin while providing all the tools needed to create sophisticated administrative areas that both developers and end-users will love.
11
+ Modern theme that upgrades Django admin with beautiful design, advanced features, and easy customization.
12
12
 
13
13
  - **Documentation:** The full documentation is available at [unfoldadmin.com](https://unfoldadmin.com?utm_medium=github&utm_source=unfold).
14
14
  - **Unfold:** The demo site is available at [unfoldadmin.com](https://unfoldadmin.com?utm_medium=github&utm_source=unfold).
@@ -16,60 +16,49 @@ Transform your Django admin into a powerful, modern administrative interface wit
16
16
  - **Turbo:** A Django & Next.js boilerplate implementing Unfold is available at [github.com/unfoldadmin/turbo](https://github.com/unfoldadmin/turbo?utm_medium=github&utm_source=unfold).
17
17
  - **Discord:** Join our Unfold community on [Discord](https://discord.gg/9sQj9MEbNz).
18
18
 
19
- ## Profesional tools & services
19
+ ## Profesional services
20
20
 
21
- Looking for professional help with your Django or Unfold project? We offer a range of tools and services to support your development process:
21
+ Need expert help with Django or Unfold? We offer services to support your project:
22
22
 
23
- ### Consulting services
23
+ - **Consulting**: Expert guidance on Django architecture, performance, feature development, and Unfold integration. [Learn more](https://unfoldadmin.com/consulting/?utm_medium=github&utm_source=unfold)
24
+ - **Support**: Assistance with integrating or customizing Unfold, including live 1:1 calls and implementation review. Fixed price, no ongoing commitment. [Learn more](https://unfoldadmin.com/support/?utm_medium=github&utm_source=unfold)
25
+ - **Studio**: Visually customize Django admin with own color schemes. Access a variety of dashboard templates, a password reset flow, and more. [Learn more](https://unfoldadmin.com/studio?utm_medium=github&utm_source=unfold)
24
26
 
25
- Professional consulting services for Django applications — from architecture and performance optimization to feature development and Unfold integration.
26
- Ideal for teams looking to scale, modernize, or customize their Django projects with expert support. Learn more at [unfoldadmin.com/consulting](https://unfoldadmin.com/consulting/?utm_medium=github&utm_source=unfold).
27
+ [![dashboards](https://github.com/user-attachments/assets/7c3124ab-2f59-4254-9222-8a57970f51a6)](https://unfoldadmin.com/studio?utm_medium=github&utm_source=unfold)
27
28
 
28
- ### Support package
29
+ ## Latest improvements
29
30
 
30
- If you need assistance with integrating or customizing Unfold, support packages are available. They include live 1:1 calls, implementation review, and ongoing Discord-based support fixed price, no ongoing commitment. Learn more at [unfoldadmin.com/support](https://unfoldadmin.com/support/?utm_medium=github&utm_source=unfold).
31
+ - **Datasets**: Display custom changelists on change form detail pages.
32
+ - **Command**: Offers a command palette for quick searching across all models or custom-injected data.
33
+ - **Constance**: Official `django-constance` support with a completely new design and UX improvements.
31
34
 
32
- ### Unfold Studio
35
+ ## Core features
33
36
 
34
- Unfold Studio lets you visually customize your Django admin without writing code — update colors, logos, sidebar, and interface styles to match your brand in minutes. Give your admin a polished, professional look that feels truly yours. Available at [unfoldadmin.com/studio](https://unfoldadmin.com/studio).
35
-
36
- [![dashboards](https://github.com/user-attachments/assets/7c3124ab-2f59-4254-9222-8a57970f51a6)](https://unfoldadmin.com/studio)
37
-
38
-
39
- ## Fresh Features & Enhancements
40
-
41
- - **Command**: Offers a command palette for quick searching across all models or custom-injected data
42
- - **django-constance**: Official support with a completely new design and UX improvements
43
- - **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance
44
- - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
45
- - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
46
-
47
- ## Core Features & Capabilities
48
-
49
- - **Visual Interface**: Provides a modern user interface based on the Tailwind CSS framework.
37
+ - **Visual interface**: Provides a modern user interface based on the Tailwind CSS framework.
50
38
  - **Sidebar navigation**: Simplifies the creation of sidebar menus with icons, collapsible sections, and more.
51
39
  - **Dark mode support**: Includes both light and dark mode themes.
52
40
  - **Flexible actions**: Provides multiple ways to define actions throughout the admin interface.
53
41
  - **Advanced filters**: Features custom dropdowns, autocomplete, numeric, datetime, and text field filters.
54
42
  - **Dashboard tools**: Includes helpers for building custom dashboard pages.
55
43
  - **UI components**: Offers reusable interface components such as cards, buttons, and charts.
56
- - **Crispy forms**: Custom template pack for django-crispy-forms to style forms with Unfold's design system
44
+ - **Crispy forms**: Custom template pack for django-crispy-forms to style forms with Unfold's design system.
57
45
  - **WYSIWYG editor**: Built-in support for WYSIWYG editing through Trix.
58
- - **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`
59
- - **Inline tabs:** Group inlines into tab navigation in the change form
60
- - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form
61
- - **Model tabs:** Allow defining custom tab navigation for models
62
- - **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form
63
- - **Sortable inlines:** Allow sorting inlines by dragging and dropping
64
- - **Command**: Offers a command palette for quick searching across all models or custom-injected data
65
- - **Environment label:** Distinguish between environments by displaying a label
66
- - **Nonrelated inlines:** Display nonrelated models as inlines in the change form
67
- - **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance
68
- - **Favicons:** Built-in support for configuring various site favicons
69
- - **Themes:** Allow customization of color scheme, background color, border radius, and more
70
- - **Font colors:** Adjust font colors for better readability
71
- - **Changeform modes:** Display fields in compressed mode in the change form
72
- - **Language switcher:** Allow changing language directly from the admin area
46
+ - **Array widget:** Built-in widget for `django.contrib.postgres.fields.ArrayField`.
47
+ - **Inline tabs:** Group inlines into tab navigation in the change form.
48
+ - **Conditional fields:** Show or hide fields dynamically based on the values of other fields in the form.
49
+ - **Model tabs:** Allow defining custom tab navigation for models.
50
+ - **Fieldset tabs:** Merge multiple fieldsets into tabs in the change form.
51
+ - **Sortable inlines:** Allow sorting inlines by dragging and dropping.
52
+ - **Command**: Offers a command palette for quick searching across all models or custom-injected data.
53
+ - **Datasets**: Custom changelists `ModelAdmin` displayed on change form detail pages.
54
+ - **Environment label:** Distinguish between environments by displaying a label.
55
+ - **Nonrelated inlines:** Display nonrelated models as inlines in the change form.
56
+ - **Paginated inlines:** Break down large record sets into pages within inlines for better admin performance.
57
+ - **Favicons:** Built-in support for configuring various site favicons.
58
+ - **Themes:** Allow customization of color scheme, background color, border radius, and more.
59
+ - **Font colors:** Adjust font colors for better readability.
60
+ - **Changeform modes:** Display fields in compressed mode in the change form.
61
+ - **Language switcher:** Allow changing language directly from the admin area.
73
62
  - **Infinite paginator:** Efficiently handle large datasets with seamless pagination that reduces server load
74
63
  - **Parallel admin:** Supports [running the default admin](https://unfoldadmin.com/blog/migrating-django-admin-unfold/?utm_medium=github&utm_source=unfold) alongside Unfold.
75
64
  - **Third-party packages:** Provides default support for multiple popular applications.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "django-unfold"
3
- version = "0.68.0"
3
+ version = "0.69.0"
4
4
  description = "Modern Django admin theme for seamless interface development"
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -7,8 +7,6 @@ from django.contrib.admin import StackedInline as BaseStackedInline
7
7
  from django.contrib.admin import TabularInline as BaseTabularInline
8
8
  from django.contrib.admin import display, helpers
9
9
  from django.contrib.admin.options import InlineModelAdmin
10
- from django.contrib.admin.views import main
11
- from django.contrib.admin.views.main import IGNORED_PARAMS
12
10
  from django.contrib.contenttypes.admin import (
13
11
  GenericStackedInline as BaseGenericStackedInline,
14
12
  )
@@ -31,7 +29,11 @@ from unfold.forms import (
31
29
  PaginationGenericInlineFormSet,
32
30
  PaginationInlineFormSet,
33
31
  )
34
- from unfold.mixins import ActionModelAdminMixin, BaseModelAdminMixin
32
+ from unfold.mixins import (
33
+ ActionModelAdminMixin,
34
+ BaseModelAdminMixin,
35
+ DatasetModelAdminMixin,
36
+ )
35
37
  from unfold.overrides import FORMFIELD_OVERRIDES_INLINE
36
38
  from unfold.typing import FieldsetsType
37
39
  from unfold.views import ChangeList
@@ -46,7 +48,9 @@ checkbox = UnfoldBooleanWidget(
46
48
  )
47
49
 
48
50
 
49
- class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
51
+ class ModelAdmin(
52
+ BaseModelAdminMixin, ActionModelAdminMixin, DatasetModelAdminMixin, BaseModelAdmin
53
+ ):
50
54
  action_form = ActionForm
51
55
  custom_urls = ()
52
56
  add_fieldsets = ()
@@ -100,39 +104,6 @@ class ModelAdmin(BaseModelAdminMixin, ActionModelAdminMixin, BaseModelAdmin):
100
104
 
101
105
  return super().changelist_view(request, extra_context)
102
106
 
103
- def changeform_view(
104
- self,
105
- request: HttpRequest,
106
- object_id: str | None = None,
107
- form_url: str = "",
108
- extra_context: dict[str, Any] | None = None,
109
- ) -> TemplateResponse:
110
- self.request = request
111
- extra_context = extra_context or {}
112
- datasets = self.get_changeform_datasets(request)
113
-
114
- # Monkeypatch IGNORED_PARAMS to add dataset page and search arguments into ignored params
115
- ignored_params = []
116
- for dataset in datasets:
117
- ignored_params.append(f"{dataset.model._meta.model_name}-q")
118
- ignored_params.append(f"{dataset.model._meta.model_name}-p")
119
-
120
- main.IGNORED_PARAMS = (*IGNORED_PARAMS, *ignored_params)
121
-
122
- rendered_datasets = []
123
- for dataset in datasets:
124
- rendered_datasets.append(
125
- dataset(
126
- request=request,
127
- extra_context={
128
- "object": object_id,
129
- },
130
- )
131
- )
132
-
133
- extra_context["datasets"] = rendered_datasets
134
- return super().changeform_view(request, object_id, form_url, extra_context)
135
-
136
107
  def get_list_display(self, request: HttpRequest) -> list[str]:
137
108
  list_display = super().get_list_display(request)
138
109
 
@@ -23,16 +23,29 @@ class BaseDataset:
23
23
 
24
24
  @property
25
25
  def contents(self) -> str:
26
+ if self.model_admin_instance.get_actions(self.request):
27
+ action_form = self.model_admin_instance.action_form(auto_id=None)
28
+ action_form.fields[
29
+ "action"
30
+ ].choices = self.model_admin_instance.get_action_choices(self.request)
31
+ else:
32
+ action_form = None
33
+
26
34
  return render_to_string(
27
35
  "unfold/helpers/dataset.html",
28
36
  request=self.request,
29
37
  context={
30
38
  "dataset": self,
31
- "cl": self.cl(),
39
+ "id": self.id,
40
+ "cl": self.cl,
41
+ "tab": self.tab,
32
42
  "opts": self.model._meta,
43
+ "action_form": action_form,
44
+ "actions_selection_counter": True,
33
45
  },
34
46
  )
35
47
 
48
+ @property
36
49
  def cl(self) -> DatasetChangeList:
37
50
  list_display = self.model_admin_instance.get_list_display(self.request)
38
51
  list_display_links = self.model_admin_instance.get_list_display_links(
@@ -40,6 +53,10 @@ class BaseDataset:
40
53
  )
41
54
  sortable_by = self.model_admin_instance.get_sortable_by(self.request)
42
55
  search_fields = self.model_admin_instance.get_search_fields(self.request)
56
+
57
+ if self.model_admin_instance.get_actions(self.request):
58
+ list_display = ["action_checkbox", *list_display]
59
+
43
60
  cl = DatasetChangeList(
44
61
  request=self.request,
45
62
  model=self.model,
@@ -60,6 +77,10 @@ class BaseDataset:
60
77
 
61
78
  return cl
62
79
 
80
+ @property
81
+ def id(self) -> str:
82
+ return self.__class__.__name__
83
+
63
84
  @property
64
85
  def model_name(self) -> str:
65
86
  return self.model._meta.model_name
@@ -53,20 +53,20 @@ class ActionForm(forms.Form):
53
53
  {
54
54
  "class": " ".join(
55
55
  [
56
- "appearance-none",
57
- "!bg-white/20",
58
- "font-medium",
59
- "grow",
60
- "px-3",
61
- "py-2",
62
- "pr-8",
63
- "rounded-default",
64
- "!text-white",
65
- "truncate",
66
- "!outline-primary-400",
67
- "dark:!outline-primary-700",
68
- "*:text-base-700",
69
- "lg:w-72",
56
+ "group-[.changelist-actions]:appearance-none",
57
+ "group-[.changelist-actions]:!bg-white/20",
58
+ "group-[.changelist-actions]:font-medium",
59
+ "group-[.changelist-actions]:grow",
60
+ "group-[.changelist-actions]:px-3",
61
+ "group-[.changelist-actions]:py-2",
62
+ "group-[.changelist-actions]:pr-8",
63
+ "group-[.changelist-actions]:rounded-default",
64
+ "group-[.changelist-actions]:!text-current",
65
+ "group-[.changelist-actions]:truncate",
66
+ "group-[.changelist-actions]:!outline-primary-400",
67
+ "group-[.changelist-actions]:dark:!outline-primary-700",
68
+ "group-[.changelist-actions]:*:text-base-700",
69
+ "group-[.changelist-actions]:lg:w-72",
70
70
  ]
71
71
  ),
72
72
  "aria-label": _("Select action to run"),
@@ -79,7 +79,12 @@ class ActionForm(forms.Form):
79
79
  label="",
80
80
  required=False,
81
81
  initial=0,
82
- widget=forms.HiddenInput({"class": "select-across"}),
82
+ widget=forms.HiddenInput(
83
+ {
84
+ "class": "select-across",
85
+ "x-model": "selectAcross",
86
+ }
87
+ ),
83
88
  )
84
89
 
85
90
 
@@ -92,6 +97,8 @@ class AuthenticationForm(AdminAuthenticationForm):
92
97
  ) -> None:
93
98
  super().__init__(request, *args, **kwargs)
94
99
 
100
+ self.fields["username"].widget.attrs["autofocus"] = ""
101
+
95
102
  self.fields["username"].widget.attrs["class"] = " ".join(BASE_INPUT_CLASSES)
96
103
  self.fields["password"].widget.attrs["class"] = " ".join(BASE_INPUT_CLASSES)
97
104
 
@@ -0,0 +1,5 @@
1
+ from unfold.mixins.action_model_admin import ActionModelAdminMixin
2
+ from unfold.mixins.base_model_admin import BaseModelAdminMixin
3
+ from unfold.mixins.dataset_model_admin import DatasetModelAdminMixin
4
+
5
+ __all__ = ["BaseModelAdminMixin", "ActionModelAdminMixin", "DatasetModelAdminMixin"]
@@ -0,0 +1,62 @@
1
+ from typing import Any
2
+
3
+ from django.contrib.admin import helpers
4
+ from django.contrib.admin.views import main
5
+ from django.contrib.admin.views.main import IGNORED_PARAMS
6
+ from django.http import HttpRequest
7
+ from django.template.response import TemplateResponse
8
+
9
+
10
+ class DatasetModelAdminMixin:
11
+ def changeform_view(
12
+ self,
13
+ request: HttpRequest,
14
+ object_id: str | None = None,
15
+ form_url: str = "",
16
+ extra_context: dict[str, Any] | None = None,
17
+ ) -> TemplateResponse:
18
+ self.request = request
19
+ extra_context = extra_context or {}
20
+ datasets = self.get_changeform_datasets(request)
21
+
22
+ # Monkeypatch IGNORED_PARAMS to add dataset page and search arguments into ignored params
23
+ ignored_params = []
24
+ for dataset in datasets:
25
+ ignored_params.append(f"{dataset.model._meta.model_name}-q")
26
+ ignored_params.append(f"{dataset.model._meta.model_name}-p")
27
+
28
+ main.IGNORED_PARAMS = (*IGNORED_PARAMS, *ignored_params)
29
+
30
+ rendered_datasets = []
31
+ for dataset in datasets:
32
+ rendered_datasets.append(
33
+ dataset(
34
+ request=request,
35
+ extra_context={
36
+ "object": object_id,
37
+ },
38
+ )
39
+ )
40
+
41
+ extra_context["datasets"] = rendered_datasets
42
+ selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME)
43
+
44
+ if (
45
+ request.method == "POST"
46
+ and selected
47
+ and "dataset" in request.POST
48
+ and helpers.ACTION_CHECKBOX_NAME in request.POST
49
+ ):
50
+ dataset = None
51
+ for item in rendered_datasets:
52
+ if item.id == request.POST["dataset"]:
53
+ dataset = item
54
+
55
+ response = dataset.model_admin_instance.response_action(
56
+ request, queryset=dataset.cl.get_queryset(request)
57
+ )
58
+
59
+ if response:
60
+ return response
61
+
62
+ return super().changeform_view(request, object_id, form_url, extra_context)
@@ -79,6 +79,7 @@ CONFIG_DEFAULTS = {
79
79
  "LOGIN": {
80
80
  "image": None,
81
81
  "redirect_after": None,
82
+ "form": None,
82
83
  },
83
84
  "EXTENSIONS": {"modeltranslation": {"flags": {}}},
84
85
  }
@@ -47,7 +47,11 @@ class UnfoldAdminSite(AdminSite):
47
47
 
48
48
  super().__init__(name)
49
49
 
50
- if self.login_form is None:
50
+ custom_login_form = get_config(self.settings_name)["LOGIN"]["form"]
51
+
52
+ if custom_login_form is not None:
53
+ self.login_form = import_string(custom_login_form)
54
+ elif self.login_form is None:
51
55
  self.login_form = AuthenticationForm
52
56
 
53
57
  def get_urls(self) -> list[URLPattern]: