使用带有Wagtail admin

时间:2018-06-08 20:33:10

标签: django wagtail

我有Order模型和OrderItem模型,save()覆盖Orderpost_save覆盖OrderItem信号保存Order后,OrderItem总计和状态将自动更新。我已经设置了wagtailhooks.py文件,我在其中为ModelAdmin模型设置了Order。请注意,在以下模型定义中,必须使用ClusterableModelParentalKey来使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) 

0 个答案:

没有答案