Cal*_*Don 12 django django-signals django-models django-admin
是否可以在django管理表单上编辑实际对象之前保存相关对象?
例如:
在 models.py
class Parent(model.Model):
pass
class Child(model.Model):
parent = models.ForeignKey(Parent)
@receiver(post_save,sender = Parent)
def notify_parent_save(sender, instance=None, **kwargs):
print "Parent save"
@receiver(post_save,sender = Child)
def notify_child_save(sender, instance=None, **kwargs):
print "Child saved"
Run Code Online (Sandbox Code Playgroud)
在 admin.py
class ChildInline(admin.TabularInline):
model = Child
extra = 1
class ParentsAdmin(admin.ModelAdmin):
inlines = [ChildInline]
admin.site.register(Parent,ParentsAdmin)
Run Code Online (Sandbox Code Playgroud)
现在,在django admin中,如果我保存父对象,它将在控制台上输出.
Parent save
Child save
Run Code Online (Sandbox Code Playgroud)
我需要这个按照顺序发生:
Child save
Parent save
Run Code Online (Sandbox Code Playgroud)
ccr*_*san 16
以下将首先保存孩子:
class ParentAdmin(admin.ModelAdmin):
inlines = [ChildInline]
def save_model(self, request, obj, form, change):
pass # don't actually save the parent instance
def save_formset(self, request, form, formset, change):
formset.save() # this will save the children
form.instance.save() # form.instance is the parent
Run Code Online (Sandbox Code Playgroud)
小智 7
我在这篇文章中遇到了问题的答案,所以我想出了一个更简洁的答案.我遇到了一个问题,因为使用django-fsm,这里的其他答案会尝试多次保存模型(每个formset一次),而不是一次.
def save_model(self, request, obj, form, change):
if not obj.pk: # call super method if object has no primary key
super(YourAdmin, self).save_model(request, obj, form, change)
else:
pass # don't actually save the parent instance
def save_related(self, request, form, formsets, change):
form.save_m2m()
for formset in formsets:
self.save_formset(request, form, formset, change=change)
super(YourAdmin, self).save_model(request, form.instance, form, change)
Run Code Online (Sandbox Code Playgroud)
这个必要的只是翻转了在Django ModelAdmin源中调用的save_model和save_related的顺序
crisan 的回答让我走上了正轨,但我认为数据库中尚不存在的实例的保存行为存在缺陷。在这种情况下,不可能先保存相关对象,因为它们没有可以指向的外键。对我来说,以下扩展成功了:
class ParentAdmin(admin.ModelAdmin):
inlines = [ChildInline]
def save_model(self, request, obj, form, change):
if not obj.pk: # call super method if object has no primary key
super(ParentAdmin, self).save_model(request, obj, form, change)
else:
pass # don't actually save the parent instance
def save_formset(self, request, form, formset, change):
formset.save() # this will save the children
form.instance.save() # form.instance is the parent
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6640 次 |
| 最近记录: |