Django-Admin TabularInline 保存前修改内联项属性
Django-Admin TabularInline modify inline item attribute before save
您好,我需要能够在保存或修改内联对象时将当前用户添加到该对象。我正在使用 django-admin 仪表板,因为此应用程序不面向 public。
class Med(models.Model):
generic_name = models.CharField(max_length=33)
last_updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)
def save_model(self, request, obj, form, change):
try:
obj.last_updated_by = request.user
except AttributeError:
obj.last_updated_by = None
super().save_model(request, obj, form, change)
class Comment(models.Model):
text = models.TextField(("Comment"), max_length = 1000, null=False)
med = models.ForeignKey(Med, related_name="comments", on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)
def save_model(self, request, obj, form, change):
obj.user = request.user
super().save_model(request, obj, form, change)
class CommentInline(admin.TabularInline):
model = Comment
extra = 0
class Med(admin.ModelAdmin):
inlines = (CommentInline,)
我也试图重写 save_related
函数,但似乎它包含的 CommentFormSet 对象是所有对象,而不是仅修改或保存的对象:
'_queryset': <QuerySet [<Comment: test>, <Comment: another test>]>,
有关此主题的一些 SO 帖子已经过时,并且没有足够的信息来推断有效的 save_related
实现。
我认为您要覆盖的方法是 save_formset
。此方法在 AdminModel 中的每个内联调用一次,并保存内联对象。
你可以这样使用它:
class Med(admin.ModelAdmin):
inlines = (CommentInline,)
def save_formset(self, request, form, formset, change):
for inline_form in formset.forms:
if inline_form.has_changed():
inline_form.instance.user = request.user
super().save_formset(request, form, formset, change)
这会将当前用户添加到正在修改的对象中。
注意,这个解决方案也适用于我:
class MedAdmin(admin.ModelAdmin):
inlines = (CommentInline,)
def save_related(self, request, form, formsets, change):
for formset in formsets:
list_comment = formset.save(commit=False)
for comment in list_comment:
comment.user = request.user
return super().save_related(request, form, formsets, change)
您好,我需要能够在保存或修改内联对象时将当前用户添加到该对象。我正在使用 django-admin 仪表板,因为此应用程序不面向 public。
class Med(models.Model):
generic_name = models.CharField(max_length=33)
last_updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)
def save_model(self, request, obj, form, change):
try:
obj.last_updated_by = request.user
except AttributeError:
obj.last_updated_by = None
super().save_model(request, obj, form, change)
class Comment(models.Model):
text = models.TextField(("Comment"), max_length = 1000, null=False)
med = models.ForeignKey(Med, related_name="comments", on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL)
def save_model(self, request, obj, form, change):
obj.user = request.user
super().save_model(request, obj, form, change)
class CommentInline(admin.TabularInline):
model = Comment
extra = 0
class Med(admin.ModelAdmin):
inlines = (CommentInline,)
我也试图重写 save_related
函数,但似乎它包含的 CommentFormSet 对象是所有对象,而不是仅修改或保存的对象:
'_queryset': <QuerySet [<Comment: test>, <Comment: another test>]>,
有关此主题的一些 SO 帖子已经过时,并且没有足够的信息来推断有效的 save_related
实现。
我认为您要覆盖的方法是 save_formset
。此方法在 AdminModel 中的每个内联调用一次,并保存内联对象。
你可以这样使用它:
class Med(admin.ModelAdmin):
inlines = (CommentInline,)
def save_formset(self, request, form, formset, change):
for inline_form in formset.forms:
if inline_form.has_changed():
inline_form.instance.user = request.user
super().save_formset(request, form, formset, change)
这会将当前用户添加到正在修改的对象中。
注意,这个解决方案也适用于我:
class MedAdmin(admin.ModelAdmin):
inlines = (CommentInline,)
def save_related(self, request, form, formsets, change):
for formset in formsets:
list_comment = formset.save(commit=False)
for comment in list_comment:
comment.user = request.user
return super().save_related(request, form, formsets, change)