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.
- {django_unfold-0.68.0 → django_unfold-0.69.0}/PKG-INFO +31 -42
- {django_unfold-0.68.0 → django_unfold-0.69.0}/README.md +30 -41
- {django_unfold-0.68.0 → django_unfold-0.69.0}/pyproject.toml +1 -1
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/admin.py +8 -37
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/datasets.py +22 -1
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/forms.py +22 -15
- django_unfold-0.69.0/src/unfold/mixins/__init__.py +5 -0
- django_unfold-0.69.0/src/unfold/mixins/dataset_model_admin.py +62 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/settings.py +1 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/sites.py +5 -1
- django_unfold-0.69.0/src/unfold/static/admin/js/actions.js +246 -0
- django_unfold-0.69.0/src/unfold/static/unfold/css/styles.css +2 -0
- django_unfold-0.69.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/actions.html +2 -2
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_form.html +8 -4
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_list.html +1 -1
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_list_results.html +1 -1
- django_unfold-0.69.0/src/unfold/templates/admin/dataset_actions.html +50 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/edit_inline/stacked.html +1 -7
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/edit_inline/tabular.html +1 -7
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/includes/fieldset.html +1 -3
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/search_form.html +1 -1
- django_unfold-0.69.0/src/unfold/templates/registration/password_change_done.html +11 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/registration/password_change_form.html +10 -6
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_actions.html +1 -1
- django_unfold-0.69.0/src/unfold/templates/unfold/helpers/dataset.html +31 -0
- django_unfold-0.69.0/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +24 -0
- django_unfold-0.69.0/src/unfold/templates/unfold/helpers/inline_heading.html +11 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_items.html +6 -4
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templatetags/unfold.py +47 -70
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templatetags/unfold_list.py +12 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/widgets.py +1 -2
- django_unfold-0.68.0/src/unfold/mixins/__init__.py +0 -4
- django_unfold-0.68.0/src/unfold/static/unfold/css/styles.css +0 -2
- django_unfold-0.68.0/src/unfold/static/unfold/fonts/material-symbols/Material-Symbols-Outlined.woff2 +0 -0
- django_unfold-0.68.0/src/unfold/templates/registration/password_change_done.html +0 -12
- django_unfold-0.68.0/src/unfold/templates/unfold/helpers/dataset.html +0 -19
- django_unfold-0.68.0/src/unfold/templates/unfold/helpers/fieldsets_tabs.html +0 -26
- {django_unfold-0.68.0 → django_unfold-0.69.0}/LICENSE.md +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/checks.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/components.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/settings.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/templates/admin/constance/change_list.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/constance/templates/admin/constance/includes/results_list.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/autocomplete_filters.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/choice_filters.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/datetime_filters.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/dropdown_filters.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/mixins.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/numeric_filters.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/admin/text_filters.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/forms.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/css/nouislider/nouislider.min.css +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/DateTimeShortcuts.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/admin-numeric-filter.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/nouislider/nouislider.min.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/wnumb/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/static/unfold/filters/js/wnumb/wNumb.min.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_date_range.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_datetime_range.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_field.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_range.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_single.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/filters/templates/unfold/filters/filters_numeric_slider.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/css/trix/trix.css +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix/trix.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/static/unfold/forms/js/trix.config.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/templates/unfold/forms/array.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/templates/unfold/forms/helpers/toolbar.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/templates/unfold/forms/wysiwyg.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/forms/widgets.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/change_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/field.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/admin/guardian/model/obj_perms_manage.html +0 -0
- {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
- {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
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/unfold/guardian/group_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/guardian/templates/unfold/guardian/user_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/forms.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/base.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/change_form.html +0 -0
- {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
- {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
- {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
- {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
- {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
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/export.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_confirm.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_errors.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_preview.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/import_export/templates/admin/import_export/import_validation.html +0 -0
- {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
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/admin.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/checks.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/inlines/forms.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/location_field/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/location_field/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/location_field/templates/location_field/map_widget.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/apps.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/object_history_list.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/contrib/simple_history/templates/simple_history/submit_line.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/dataclasses.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/decorators.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/enums.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/exceptions.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/fields.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/layout.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/mixins/action_model_admin.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/mixins/base_model_admin.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/overrides.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/paginator.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/sections.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/admin/js/admin/RelatedObjectLookups.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/admin/js/inlines.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/css/simplebar/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/css/simplebar/simplebar.css +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-Bold.woff2 +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-Medium.woff2 +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-Regular.woff2 +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/Inter-SemiBold.woff2 +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/inter/styles.css +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/material-symbols/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/fonts/material-symbols/styles.css +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.anchor.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.persist.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.resize.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/alpine/alpine.sort.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/app.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/chart/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/chart/chart.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/htmx/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/htmx/htmx.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/select2.init.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/simplebar/LICENSE +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/static/unfold/js/simplebar/simplebar.js +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/styles.css +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/app_index.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/app_list.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/auth/user/add_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/auth/user/change_password.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/base.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/base_site.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_form_object_tools.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/change_list_object_tools.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/date_hierarchy.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/delete_confirmation.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/delete_selected_confirmation.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/filter.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/includes/object_delete_summary.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/index.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/login.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/nav_sidebar.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/object_history.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/pagination.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/admin/submit_line.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/auth/widgets/read_only_password_hash.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/registration/logged_out.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/button.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/card.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/chart/bar.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/chart/cohort.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/chart/line.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/container.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/flex.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/icon.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/layer.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/navigation.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/progress.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/separator.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/table.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/text.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/title.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/components/tracker.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/account_links.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/actions_row.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/add_link.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/app_list.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/app_list_default.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/attrs.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/boolean.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/breadcrumb_item.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_filter.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_filter_actions.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/change_list_headers.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/command.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/command_history.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/command_results.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/delete_submit_line.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/display_dropdown.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/display_header.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/display_label.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_delete.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_error.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_field.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_heading.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_row.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/edit_inline/tabular_title.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/empty_results.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field_readonly.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field_readonly_value.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/field_readonly_value_file.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/fieldset_row.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/fieldset_row_checkbox.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/fieldset_row_field.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/form_errors.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/form_label.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/header.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/header_back_button.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/header_title.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/help_text.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/history.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/label.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/language_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/language_switch.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/debug.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/error.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/errornote.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/info.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/success.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages/warning.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/messages.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/navigation.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/navigation_header.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_current_item.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_default.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_ellipsis.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_infinite.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/pagination_inline.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/popup_header.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/search.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/search_results.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/shortcut.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_branding.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_dropdown.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_icon.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/site_logo.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/submit.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_action.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_actions.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/tab_list.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/theme_switch.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/unauthenticated_header.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/unauthenticated_title.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/userlinks.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/helpers/welcomemsg.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/base.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/base_simple.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/skeleton.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/layouts/unauthenticated.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/templatetags/preserve_changelist_filters.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/clearable_file_input.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/clearable_file_input_small.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/date.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/foreign_key_raw_id.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/radio.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/radio_option.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/range.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/related_widget_wrapper.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/select.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/split_datetime.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/split_datetime_vertical.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/split_money.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/text.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/textarea.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/time.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold/widgets/url.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/display_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/errors.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/errors_formset.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/field.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/inputs.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/attrs.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/baseinput.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/button.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/buttonholder.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/checkbox.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/column.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/div.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/field_errors.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/fieldset.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/fieldset_subheader.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/help_text.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/help_text_and_errors.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/hr.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/radio_checkbox_select.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/row.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/layout/table_inline_formset.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/uni_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/whole_uni_form.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templates/unfold_crispy/whole_uni_formset.html +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/templatetags/__init__.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/typing.py +0 -0
- {django_unfold-0.68.0 → django_unfold-0.69.0}/src/unfold/utils.py +0 -0
- {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.
|
|
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
|

|
|
34
34
|

|
|
35
35
|
|
|
36
|
-
|
|
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
|
|
44
|
+
## Profesional services
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
Need expert help with Django or Unfold? We offer services to support your project:
|
|
47
47
|
|
|
48
|
-
|
|
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
|
-
|
|
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
|
+
[](https://unfoldadmin.com/studio?utm_medium=github&utm_source=unfold)
|
|
52
53
|
|
|
53
|
-
|
|
54
|
+
## Latest improvements
|
|
54
55
|
|
|
55
|
-
|
|
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
|
-
|
|
60
|
+
## Core features
|
|
58
61
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
[](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
|
-
- **
|
|
91
|
-
- **
|
|
92
|
-
- **
|
|
93
|
-
- **
|
|
94
|
-
- **
|
|
95
|
-
- **
|
|
96
|
-
- **
|
|
97
|
-
- **
|
|
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
|

|
|
9
9
|

|
|
10
10
|
|
|
11
|
-
|
|
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
|
|
19
|
+
## Profesional services
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Need expert help with Django or Unfold? We offer services to support your project:
|
|
22
22
|
|
|
23
|
-
|
|
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
|
-
|
|
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
|
+
[](https://unfoldadmin.com/studio?utm_medium=github&utm_source=unfold)
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
## Latest improvements
|
|
29
30
|
|
|
30
|
-
|
|
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
|
-
|
|
35
|
+
## Core features
|
|
33
36
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
[](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
|
-
- **
|
|
66
|
-
- **
|
|
67
|
-
- **
|
|
68
|
-
- **
|
|
69
|
-
- **
|
|
70
|
-
- **
|
|
71
|
-
- **
|
|
72
|
-
- **
|
|
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.
|
|
@@ -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
|
|
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(
|
|
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
|
-
"
|
|
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
|
-
"
|
|
58
|
-
"font-medium",
|
|
59
|
-
"grow",
|
|
60
|
-
"px-3",
|
|
61
|
-
"py-2",
|
|
62
|
-
"pr-8",
|
|
63
|
-
"rounded-default",
|
|
64
|
-
"
|
|
65
|
-
"truncate",
|
|
66
|
-
"
|
|
67
|
-
"dark:!outline-primary-700",
|
|
68
|
-
"
|
|
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(
|
|
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)
|
|
@@ -47,7 +47,11 @@ class UnfoldAdminSite(AdminSite):
|
|
|
47
47
|
|
|
48
48
|
super().__init__(name)
|
|
49
49
|
|
|
50
|
-
|
|
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]:
|