Django InlineModelAdmin - 在保存时根据请求设置内联字段(自动设置用户字段)(save_formset 与 save_model)

django

1个回答

写回答

姚bii

2025-06-22 21:55

+ 关注

Django
Django

使用Django开发Web应用程序时,我们经常会遇到需要在保存模型实例时设置一些字段的情况。在使用Django的InlineModelAdmin类处理内联模型时,有两个方法可以帮助我们实现这一需求,即save_formset和save_model。

在使用InlineModelAdmin类创建内联模型时,我们可以通过重写save_formset方法来实现在保存模型实例时设置内联字段的功能。save_formset方法接收一个参数formset,该参数包含了所有内联模型的表单实例。我们可以通过formset的save方法来保存这些表单实例。在重写save_formset方法时,我们可以在保存之前检查请求对象,然后根据请求设置特定的字段值。

下面是一个示例代码,展示了如何在保存内联模型时自动设置用户字段的功能:

Python

from Django.contrib import admin

from Django.forms.models import BaseInlineFormSet

class MyInlineFormSet(BaseInlineFormSet):

def save_new(self, form, commit=True):

instance = super().save_new(form, commit=False)

instance.user = form.request.user

if commit:

instance.save()

return instance

class MyInline(admin.TabularInline):

model = MyModel

formset = MyInlineFormSet

class MyModelAdmin(admin.ModelAdmin):

inlines = [MyInline]

def save_formset(self, request, form, formset, change):

formset.save(commit=False)

for instance in formset.new_objects:

instance.user = request.user

instance.save()

formset.save_m2m()

上述代码中,我们定义了一个名为MyInlineFormSet的内联表单集类,继承自Django的BaseInlineFormSet。在这个类中,我们重写了save_new方法,在保存新的内联模型实例时,自动设置了user字段的值为请求对象的用户。

接下来,我们定义了一个名为MyInline的内联模型类,将MyModel作为内联模型,并将之前定义的MyInlineFormSet类作为其formset属性。

最后,我们创建了一个名为MyModelAdmin的模型管理类,将MyInline注册为内联模型。在这个类中,我们重写了save_formset方法,在保存表单集时,通过循环遍历新创建的内联模型实例,并设置其user字段的值为请求对象的用户。

通过以上代码,我们可以在保存内联模型时自动设置用户字段,从而实现根据请求设置内联字段的功能。

案例代码

Python

from Django.contrib import admin

from Django.forms.models import BaseInlineFormSet

class MyInlineFormSet(BaseInlineFormSet):

def save_new(self, form, commit=True):

instance = super().save_new(form, commit=False)

instance.user = form.request.user

if commit:

instance.save()

return instance

class MyInline(admin.TabularInline):

model = MyModel

formset = MyInlineFormSet

class MyModelAdmin(admin.ModelAdmin):

inlines = [MyInline]

def save_formset(self, request, form, formset, change):

formset.save(commit=False)

for instance in formset.new_objects:

instance.user = request.user

instance.save()

formset.save_m2m()

通过上述代码,我们可以在保存内联模型时自动设置用户字段,从而实现根据请求设置内联字段的功能。这为我们在开发Django应用程序时提供了更多的灵活性和便利性。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号