验证Django管理员父表单并同时内联数据

时间:2017-10-25 10:33:38

标签: django django-admin

我在{strong> admin.py 中使用User合并了UserPhoneTabularInline两个模型,但是当我使用单个提交按钮保存两个模型数据时只能检测User模型

的变化
def save_model(self, request, obj, form, change):
     print "form:",form.changed_data

但是当我在一次提交中保存两个模型数据时,我还需要检查UserPhone模型数据的更改。

    Admin.py

    class UserPhoneInline(admin.TabularInline):
        model = UserPhone

    class UserAdmin(admin.ModelAdmin):
        list_display = ()

        inlines = [
                UserPhoneInline,
            ]
        def save_model(self, request, obj, form, change):
            obj.save()
            print "form:",form.changed_data,"change:",change

    class UserPhoneAdmin(admin.ModelAdmin):
        list_display = ()
        list_filter= []

1 个答案:

答案 0 :(得分:1)

首先,如果您的模型Userphone是模型User的内联,您可能希望删除这些行,因为它是不必要的:

 class UserPhoneAdmin(admin.ModelAdmin):
    list_display = ()
    list_filter= []

然后,如果您想要访问两种表单数据,我可以看到的方法是覆盖clean这样的BaseInlineFormSet方法,(将其添加到admin.py):

class InlineFormset(forms.models.BaseInlineFormSet):
    def clean(self):
        for form in self.forms:
            for field in form.changed_data:
                print (form.cleaned_data[field])

只是你理解,我认为你误解了changed_data是什么。这来自documentation

  

changed_data属性返回字段名称列表   其形式的绑定数据(通常是request.POST)中的值不同   从最初提供的内容。如果没有数据,它返回一个空列表   不同。

因此,在我的解决方案中,我使用它来查看在汇总表单时哪些数据已更改。然后我使用cleaned_data,它是表单验证的每个值的字典,并访问与已更改的字段相对应的值。随意打印您打印的内容。

修改

我忘了提到你需要在你的内联声明中添加这一行:

class UserPhoneInline(admin.TabularInline):
    model = UserPhone
    formset = InlineFormset #line to add