我有Order
模型和OrderItem
模型,save()
覆盖Order
,post_save
覆盖OrderItem
信号保存Order
后,OrderItem
总计和状态将自动更新。我已经设置了wagtailhooks.py
文件,我在其中为ModelAdmin
模型设置了Order
。请注意,在以下模型定义中,必须使用ClusterableModel
和ParentalKey
来使OrderItem
在Wagtail管理员的Order
下正确显示:
class Order(BaseModel, ClusterableModel):
...
def save(self, *args, **kwargs):
self.calculate_costs()
self.set_status()
super(Order, self).save(*args, **kwargs)
panels = [
MultiFieldPanel([
FieldPanel('number'),
...,
]),
InlinePanel('order_items', label="Order Items")
]
class OrderItem(BaseModel, Orderable):
order = ParentalKey('Order', null=True, on_delete=models.PROTECT, related_name='order_items')
product = ParentalKey('Product', null=True, on_delete=models.PROTECT)
...
panels = [
...
]
# SIGNALS
@receiver(post_save, sender=OrderItem)
def update_order(sender, instance, **kwargs):
instance.order.save()
问题:当我尝试从Wagtail管理员编辑它时,带有相关订单项的订单将显示正常,但是当我尝试从Wagtail管理员保存时,我得到的最大递归深度超出错误。但是,当我从DJANGO管理员保存相同的订单时,它保存得很好。如果我断开post_save
上的OrderItem
信号,那么订单也会从Wagtail管理员那里保存好。有没有办法让Wagtail管理员成功保存一个post_save
信号的订单?
跟踪(记录了第一次,第二次和第三次递归调用):
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/core/handlers/exception.py in inner
response = get_response(request) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/core/handlers/base.py in _get_response
response = self.process_exception_by_middleware(e, request) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/core/handlers/base.py in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/views/decorators/cache.py in _cache_controlled
response = viewfunc(request, *args, **kw) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/wagtail/admin/urls/__init__.py in wrapper
return view_func(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/wagtail/admin/decorators.py in decorated_view
return view_func(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/wagtail/contrib/modeladmin/options.py in edit_view
return view_class.as_view(**kwargs)(request) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/views/generic/base.py in view
return self.dispatch(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/utils/decorators.py in _wrapper
return bound_func(*args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/contrib/auth/decorators.py in _wrapped_view
return view_func(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/utils/decorators.py in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/wagtail/contrib/modeladmin/views.py in dispatch
return super().dispatch(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/utils/decorators.py in _wrapper
return bound_func(*args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/contrib/auth/decorators.py in _wrapped_view
return view_func(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/utils/decorators.py in bound_func
return func.__get__(self, type(self))(*args2, **kwargs2) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/wagtail/contrib/modeladmin/views.py in dispatch
return super().dispatch(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/views/generic/base.py in dispatch
return handler(request, *args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/views/generic/edit.py in post
return self.form_valid(form) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/wagtail/contrib/modeladmin/views.py in form_valid
instance = form.save() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/forms.py in save
formset.save(commit=commit) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/forms.py in save
manager.commit() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/fields.py in commit
original_manager.add(item, bulk=False) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py in add
obj.save() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/base.py in save
force_update=force_update, update_fields=update_fields) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/base.py in save_base
update_fields=update_fields, raw=raw, using=using, ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/dispatch/dispatcher.py in send
for receiver in self._live_receivers(sender) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/dispatch/dispatcher.py in <listcomp>
for receiver in self._live_receivers(sender) ...
▶ Local vars
FIRST CALL TO instance.order.save() from post_save signal
./store/models.py in update_order
instance.order.save() ...
▶ Local vars
./store/models.py in save
super(Order, self).save(*args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/models.py in save
getattr(self, relation).commit() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/fields.py in commit
original_manager.add(item, bulk=False) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py in add
obj.save() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/base.py in save
force_update=force_update, update_fields=update_fields) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/base.py in save_base
update_fields=update_fields, raw=raw, using=using, ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/dispatch/dispatcher.py in send
for receiver in self._live_receivers(sender) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/dispatch/dispatcher.py in <listcomp>
for receiver in self._live_receivers(sender) ...
▶ Local vars
SECOND CALL TO instance.order.save() from post_save signal
instance.order.save() ...
▶ Local vars
./store/models.py in save
super(Order, self).save(*args, **kwargs) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/models.py in save
getattr(self, relation).commit() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/modelcluster/fields.py in commit
original_manager.add(item, bulk=False) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py in add
obj.save() ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/base.py in save
force_update=force_update, update_fields=update_fields) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/db/models/base.py in save_base
update_fields=update_fields, raw=raw, using=using, ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/dispatch/dispatcher.py in send
for receiver in self._live_receivers(sender) ...
▶ Local vars
/opt/virtualenvs/KKF-1Oq8ncY2/lib/python3.5/site-packages/django/dispatch/dispatcher.py in <listcomp>
for receiver in self._live_receivers(sender) ...
▶ Local vars
THIRD CALL TO instance.order.save() from post_save signal
./store/models.py in update_order
instance.order.save() ...
▶ Local vars
./store/models.py in save
super(Order, self).save(*args, **kwargs)