Django:成功保存表单后自定义消息

chi*_*rox 5 django django-forms django-admin django-messages

每当我在管理界面中保存模型时,它都会显示通常的"已成功保存的消息".但是,我想知道是否可以自定义此消息,因为我想要警告用户他刚刚保存的内容以及这些操作的含义.

class PlanInlineFormset(forms.models.BaseInlineFormset):
    def clean(self):
        ### How can I detect the changes?  
        ### (self.changed_data doesn't work because it's an inline)
        ### and display what he/she just changed at the top AFTER the successful save?

class PlanInline(admin.TabularInline):
    model = Plan
    formset = PlanInlineFormset
Run Code Online (Sandbox Code Playgroud)

zlo*_*ady 8

Django(> 1.2版)使用消息框架来管理消息.您可以使用该界面添加其他消息.这是一个例子:

from django.contrib import messages

class SomeModelAdmin(admin.ModelAdmin):
    # your normal ModelAdmin stuff goes here

    def save_model(self, request, obj, form, change):
        # add an additional message
        messages.info(request, "Extra message here.")
        super(SomeModelAdmin, self).save_model(request, obj, form, change)
Run Code Online (Sandbox Code Playgroud)

要检测正在保存的对象的更改,您应该覆盖ModelAdmin的save_model方法,并将传递方法的对象与当前在数据库中的版本进行比较.要在内联的情况下执行此操作,您可以覆盖save_formset方法.可能的方法可能看起来像(未经测试的代码):

class SomeModelAdmin(admin.ModelAdmin):
    # your normal ModelAdmin stuff goes here

    def save_formset(self, request, form, formset, change):
        if not change:
            formset.save()
        else:
            instances = formset.save(commit=False)

            for instance in instances:
                try:
                    # if you've got multiple types of inlines
                    # make sure your fetching from the 
                    # appropriate model type here
                    old_object = SomeOtherModel.get(id=instance.id)
                except SomeOtherModel.DoesNotExist:
                    continue

                if instance.field_x != old_object.field_x:
                    messages.info(request, "Something Changed")

            instance.save()

        formset.save_m2m()
Run Code Online (Sandbox Code Playgroud)