confirmation_fields and confirm_change works as expected

main
Thu Trang Pham 2020-11-01 01:45:39 -07:00
parent 47b1d6beee
commit b8cfdb591b
4 changed files with 14 additions and 9 deletions

View File

@ -10,7 +10,10 @@ from django.utils.translation import gettext as _
class AdminConfirmMixin(object): class AdminConfirmMixin(object):
"""Generic AdminConfirm Mixin""" """Generic AdminConfirm Mixin"""
# Should we ask for confirmation for changes?
confirm_change = None confirm_change = None
# if confirm_change, which fields should we confirm for?
confirmation_fields = None confirmation_fields = None
# Custom templates (designed to be over-ridden in subclasses) # Custom templates (designed to be over-ridden in subclasses)
@ -20,7 +23,7 @@ class AdminConfirmMixin(object):
""" """
Hook for specifying confirmation fields Hook for specifying confirmation fields
""" """
if self.confirmation_fields: if self.confirmation_fields is not None:
return self.confirmation_fields return self.confirmation_fields
return flatten_fieldsets(self.get_fieldsets(request, obj)) return flatten_fieldsets(self.get_fieldsets(request, obj))
@ -99,7 +102,7 @@ class AdminConfirmMixin(object):
for name, field in form.fields.items(): for name, field in form.fields.items():
initial_value = obj.__getattribute__(name) initial_value = obj.__getattribute__(name)
new_value = new_object.__getattribute__(name) new_value = new_object.__getattribute__(name)
if field.has_changed(initial_value, new_value): if field.has_changed(initial_value, new_value) and initial_value != new_value:
changed_data[name] = [initial_value, new_value] changed_data[name] = [initial_value, new_value]
if not bool(set(self.get_confirmation_fields(request, obj)) & set(changed_data.keys())): if not bool(set(self.get_confirmation_fields(request, obj)) & set(changed_data.keys())):

View File

@ -2,6 +2,8 @@
{% load i18n admin_urls %} {% load i18n admin_urls %}
{% block submit-row %} {% block submit-row %}
{% if confirm_change %}
<input hidden name="_confirm_change" value="{{ confirm_change }}" /> <input hidden name="_confirm_change" value="{{ confirm_change }}" />
{% endif %}
{{ block.super }} {{ block.super }}
{% endblock %} {% endblock %}

View File

@ -7,18 +7,17 @@ from .models import Item, Inventory, Shop
class ItemAdmin(AdminConfirmMixin, admin.ModelAdmin): class ItemAdmin(AdminConfirmMixin, admin.ModelAdmin):
list_display = ('name', 'price', 'currency') list_display = ('name', 'price', 'currency')
require_change_confirmation = True confirm_change = True
class InventoryAdmin(AdminConfirmMixin, admin.ModelAdmin): class InventoryAdmin(AdminConfirmMixin, admin.ModelAdmin):
list_display = ('shop', 'item', 'quantity') list_display = ('shop', 'item', 'quantity')
requires_change_confirmation = { confirm_change = True
'fields': ['shop'] confirmation_fields = ['shop']
}
class ShopAdmin(admin.ModelAdmin): class ShopAdmin(AdminConfirmMixin, admin.ModelAdmin):
pass confirmation_fields = ['name']
admin.site.register(Item, ItemAdmin) admin.site.register(Item, ItemAdmin)

View File

@ -25,6 +25,7 @@ class Inventory(models.Model):
class Meta: class Meta:
unique_together = ['shop', 'item'] unique_together = ['shop', 'item']
ordering = ['shop', 'item__name'] ordering = ['shop', 'item__name']
verbose_name_plural = 'Inventory'
shop = models.ForeignKey(to=Shop, on_delete=models.CASCADE, related_name='inventory') shop = models.ForeignKey(to=Shop, on_delete=models.CASCADE, related_name='inventory')
item = models.ForeignKey(to=Item, on_delete=models.CASCADE) item = models.ForeignKey(to=Item, on_delete=models.CASCADE)