【问题标题】:How to use treebeard admin in django 1.8如何在 django 1.8 中使用 treebeard 管理员
【发布时间】:2016-01-16 18:12:20
【问题描述】:

我正在尝试在管理部分使用 django-treebeard,遵循 https://tabo.pe/projects/django-treebeard/docs/2.0/admin.html 的建议

在 python 3.4 上使用 django 1.8 和 treebeard 3.0。

models.py:

class Site(models.Model):
    stype = models.IntegerField()
    name = models.CharField(max_length=255)


class SiteTree(NS_Node):
    site = models.ForeignKey(Site)

请注意,我需要以这种方式定义的模型,因为一个站点可以位于层次结构中的多个点。我发现没有开箱即用的树库支持这一点,所以我只使用嵌套集和与实际数据的多对一关系。

我尝试像这样 (admin.py) 将我的树添加到管理控制面板:

from django.contrib import admin
from .models import *
from treebeard.admin import admin_factory

# Register your models here.
admin.site.register((Site, SiteTree, admin_factory(SiteTree)))

我从中得到的是

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "D:\Python34\lib\site-packages\django\core\management\__init__.py", line 338, in execute_from_command_line
    utility.execute()
  File "D:\Python34\lib\site-packages\django\core\management\__init__.py", line 312, in execute
    django.setup()
  File "D:\Python34\lib\site-packages\django\__init__.py", line 18, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "D:\Python34\lib\site-packages\django\apps\registry.py", line 115, in populate
    app_config.ready()
  File "D:\Python34\lib\site-packages\django\contrib\admin\apps.py", line 22, in ready
    self.module.autodiscover()
  File "D:\Python34\lib\site-packages\django\contrib\admin\__init__.py", line 24, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "D:\Python34\lib\site-packages\django\utils\module_loading.py", line 74, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "D:\Python34\lib\importlib\__init__.py", line 109, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 2254, in _gcd_import
  File "<frozen importlib._bootstrap>", line 2237, in _find_and_load
  File "<frozen importlib._bootstrap>", line 2226, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 1200, in _load_unlocked
  File "<frozen importlib._bootstrap>", line 1129, in _exec
  File "<frozen importlib._bootstrap>", line 1471, in exec_module
  File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
  File "D:\Android\Projects\ApartmentTerminal\ScantronServer\settings\admin.py", line 6, in <module>
    admin.site.register((SiteTree, admin_factory(SiteTree)))
  File "D:\Python34\lib\site-packages\django\contrib\admin\sites.py", line 85, in register
    if model._meta.abstract:
  AttributeError: type object 'SiteTreeAdmin' has no attribute '_meta'

如果我使用声明视图的继承方式,什么都不会改变。

我做错了什么?

【问题讨论】:

    标签: python django django-admin django-treebeard


    【解决方案1】:

    您调用admin.site.register 的方式无效-您已将所有参数包装在一个元组中,这意味着它们作为一个参数传递给函数。试试这个:

    admin.site.register(SiteTree, admin_factory(SiteTree))
    

    或者,您可以像这样手动创建管理类:

    from django.contrib import admin
    from .models import *
    from treebeard.admin import TreeAdmin
    from treebeard.forms import movenodeform_factory
    
    class SiteTreeAdmin(TreeAdmin):
        form = movenodeform_factory(SiteTree)
    
    # Register your models here.
    admin.site.register(Site)
    admin.site.register(SiteTree, SiteTreeAdmin)
    

    【讨论】:

    • 即使尝试了这个,我也不知道为什么这会有所帮助。遍历元组最多需要我在 SiteTree 和 SiteTreeAdmin 之后移动 Site 模型。自然,将任何注册移动到单独的调用中对我的问题没有任何帮助。向 OP 添加了完整的 stach 跟踪。
    • 我不太明白你的评论。你是说你按照我的建议修改了你的代码,但你仍然得到同样的错误?
    • 是的,这就是我要说的。我还尝试移动admin_factory(SiteTree),但没有成功。问题是 treebeard.admin.TreeAdmin 类没有声明必要的 _meta。
    • 出现该错误是因为admin.site.register 试图将您提供的内容视为Model 而不是Admin 实例。这表明您仍然以错误的方式提供参数(例如,包装在元组中)。
    • 嗯,我把它改成了admin.site.register(admin_factory(SiteTree)),但现在我得到了TypeError: 'MediaDefiningClass' object is not iterable。看起来admin.site.register 需要一个可迭代的。编辑:更改为admin.site.register(SiteTree, admin_factory(SiteTree)),现在我得到&lt;class 'django.forms.widgets.SiteTreeAdmin'&gt;: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'.。更有希望,但仍然没有工作。
    猜你喜欢
    • 2013-05-16
    • 2013-12-15
    • 1970-01-01
    • 2012-03-09
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 2017-06-08
    相关资源
    最近更新 更多