sshwsfc / xadmin

Drop-in replacement of Django admin comes with lots of goodies, fully extensible with plugin support, pretty UI based on Twitter Bootstrap.
http://www.xadmin.io
BSD 3-Clause "New" or "Revised" License
4.76k stars 1.41k forks source link

'AdminDetailInlineFormsetPlugin' object has no attribute 'formsets' #270

Open nij6173 opened 9 years ago

nij6173 commented 9 years ago

6dafc003-05ed-479d-a336-965b79fec70c d84c0b18-a075-4bf4-a35c-0ceb33ac7e29 734549e8-1c02-4176-86bb-7ada5a4baa2c

Traceback: Environment:

Request Method: GET Request URL: http://127.0.0.1:8000/admin/accounts/user/2/detail/

Django Version: 1.7.7 Python Version: 2.7.8


Installed Middleware: ('django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'accounts.middleware.AccessControlMiddleware')

Traceback: File "/Users/Leo/.virtualenvs/jj/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response

  1. response = wrapped_callback(request, _callback_args, *_callback_kwargs) File "/Users/Leo/work/****/xadmin/sites.py" in wrapper
  2. return self.admin_view(view, cacheable)(_args, *_kwargs) File "/Users/Leo/.virtualenvs/jj/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
  3. response = view_func(request, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/sites.py" in inner
  4. return view(request, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in view
  5. return handler(request, _args, *_kwargs) File "/Users/Leo/.virtualenvs/jj/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
  6. return bound_func(_args, *_kwargs) File "/Users/Leo/.virtualenvs/jj/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
  7. response = view_func(request, _args, *_kwargs) File "/Users/Leo/.virtualenvs/jj/lib/python2.7/site-packages/django/utils/decorators.py" in bound_func
  8. return func.get(self, type(self))(_args2, *_kwargs2) File "/Users/Leo/work/****/xadmin/views/base.py" in method
  9. return filter_chain(filters, len(filters) - 1, _inner_method, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in filter_chain
  10. return func() File "/Users/Leo/work/****/xadmin/views/base.py" in _inner_method
  11. return func(self, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/detail.py" in get
  12. helper = self.get_form_helper() File "/Users/Leo/work/****/xadmin/views/base.py" in method
  13. return filter_chain(filters, len(filters) - 1, _inner_method, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in filter_chain
  14. return filter_chain(filters, token - 1, _inner_method, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in filter_chain
  15. return func() File "/Users/Leo/work/****/xadmin/views/base.py" in _inner_method
  16. return fm(func if fargs[1] == '__' else func(), _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in _inner_method
  17. return func(self, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/detail.py" in get_form_helper
  18. layout = self.get_form_layout() File "/Users/Leo/work/****/xadmin/views/base.py" in method
  19. return filter_chain(filters, len(filters) - 1, _inner_method, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in filter_chain
  20. return filter_chain(filters, token - 1, _inner_method, _args, *_kwargs) File "/Users/Leo/work/****/xadmin/views/base.py" in filter_chain
  21. return func() File "/Users/Leo/work/****/xadmin/views/base.py" in _inner_method
  22. return fm(func if fargs[1] == '__' else func(), _args, *_kwargs) File "/Users/Leo/work/****/xadmin/plugins/inline.py" in get_form_layout
  23. fs = [(f.model, InlineFormset(f, allow_blank)) for f in self.formsets]

Exception Type: AttributeError at /admin/accounts/user/2/detail/ Exception Value: 'accountsuserAdminDetailInlineFormsetPlugin' object has no attribute 'formsets'

我的处理方法: 在xadmin/plugins/inline.py

找到class InlineFormsetPlugin(BaseAdminPlugin)

def get_form_layout(self, layout):

fix 'AdminDetailInlineFormsetPlugin' object has no attribute 'formsets'

    try:
        self.instance_forms('ret')
    except Exception as e:
        print '----get_form_layout: ', e
    # end
    allow_blank = isinstance(self.admin_view, DetailAdminView)
    # fixed #176 bug, change dict to list
    fs = [(f.model, InlineFormset(f, allow_blank)) for f in self.formsets]
    replace_inline_objects(layout, fs)
    if fs:
        container = get_first_field(layout, Column)
        if not container:
            container = get_first_field(layout, Container)
        if not container:
            container = layout
        # fixed #176 bug, change dict to list
        for key, value in fs:
            container.append(value)
   return layout  

fe3ffa9c-c553-4a78-a1b8-2a141c6b7379

anyone can help fix this for official code?

nij6173 commented 9 years ago

or please tell me how to fix this in my sourcecode if i make some misstakes~

alexsilva commented 9 years ago

https://github.com/sshwsfc/django-xadmin/blob/55644113d2a4d4f79032d6035186fa4de9bc88bf/xadmin/plugins/inline.py#L469

To redefine a method without side effects, you must call the parent class method.

super(UserAdmin, self).get_model_form(form, **kwargs)
...
Your code here
nij6173 commented 8 years ago

3q, i will have a try!