How to force-save an “empty”/unchanged django admin inline?

后端 未结 3 1150
感情败类
感情败类 2020-12-05 09:42

I have some inlines in one of my admin models which have default values which likely won\'t need to be changed when adding a new instance with "Add another ...". U

相关标签:
3条回答
  • 2020-12-05 10:23

    @daniel answer is great, however it will try to save the instance that is already created ever if no changes is made, which is not necessary, better to use it like:

    class AlwaysChangedModelForm(ModelForm):
        def has_changed(self, *args, **kwargs):
            if self.instance.pk is None:
                return True
            return super(AlwaysChangedModelForm, self).has_changed(*args, **kwargs)
    
    0 讨论(0)
  • 2020-12-05 10:25

    Combined @Daniels, @HardQuestions' and @jonespm answers:

    class MarkNewInstancesAsChangedModelForm(forms.ModelForm):
        def has_changed(self):
            """Returns True for new instances, calls super() for ones that exist in db.
            Prevents forms with defaults being recognized as empty/unchanged."""
            return not self.instance.pk or super().has_changed()
    
    0 讨论(0)
  • 2020-12-05 10:34

    It took me quite some time to figure out but it is actually really simple.

    from django.contrib import admin
    from django.forms.models import BaseInlineFormSet, ModelForm
    
    class AlwaysChangedModelForm(ModelForm):
        def has_changed(self):
            """ Should returns True if data differs from initial. 
            By always returning true even unchanged inlines will get validated and saved."""
            return True
    
    class CheckerInline(admin.StackedInline):
        """ Base class for checker inlines """
        extra = 0
        form = AlwaysChangedModelForm
    
    0 讨论(0)
提交回复
热议问题