PlaceholderAdmin抛出<lambda>()只取1个参数(给定2个)</lambda>

时间:2011-03-16 13:28:37

标签: django django-cms

我为django-cms写了一个插件,它有自己的模型和一个PlaceholderField。当我为模型管理员添加PlaceholderAdmin时,我在管理站点上收到了这个:

Exception Type: TemplateSyntaxError
Exception Value:    
Caught TypeError while rendering: <lambda>() takes exactly 1 argument (2 given)
Exception Location: <blablapath>/python2.6/site-packages/cms/forms/widgets.py in render, line 199

我一直在寻找解决方案,发现只有django-cms示例的一些问题,如果没有在urls.py中取消注释某些路径就无法运行,所以我猜这可能是网址的问题,尤其是我在我的网站上做了一些魔术网址。问题是:django-cms url的有效条件是什么?有任何想法吗?有解决方案吗以前有人有这个问题吗?

3 个答案:

答案 0 :(得分:6)

如果您未在管理类中继承PlaceholderAdminField,则会导致此问题。

例如:

from cms.admin.placeholderadmin import PlaceholderAdmin
from cms.models.fields import PlaceholderField

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    sidebar = PlaceholderField('sidebar')

class MyAdmin(PlaceholderAdmin):
    """ Put your usual admin stuff here. If you use fieldset,
    include the sidebar as its own tuple """
    fieldsets = (
        (None, {
            'fields': ('name',),
        }),

        ('Sidebar', {
            'classes': ('plugin-holder', 'plugin-holder-nopage'),
            'fields': ('sidebar',)
        }),
    )
admin.site.register(MyModel, MyAdmin)

答案 1 :(得分:0)

嗯,这似乎是Django-CMS中的一个错误。我从来没有使用它,但是看一下代码,很明显PlaceholderField的默认表单字段创建了一个lambda,它接受一个参数 - 一个查询集,但该表单字段的render函数用两个参数调用lambda - 请求和查询集。

解决此问题的最佳方法可能是定义自己的PlaceholderField子类,重新定义formfield方法,以便返回正确的lambda:

class FixedPlaceholderField(PlaceholderField):
    def formfield(self, **kwargs):
        return self.formfield_for_admin(None, lambda request, qs: qs, **kwargs)

并在模型中使用此字段。

如果这样修复它,可能值得在Django-CMS中引发一个错误。

答案 2 :(得分:0)

确定。我已经为我解决了这个问题。我仍然不知道发生了什么,但也许我的回答将帮助你解决这个问题;)。 我用过一种方法:

def formfield_for_dbfield(self, db_field, **kwargs):
    ...

将一个文本字段替换为TinyMCE编辑器。当我删除整个方法时,问题就消失了。如果我以后有时间,也许我会尝试深入挖掘它。 我仍然不相信这是唯一的问题。我有预感它也可能是数据,因为我已经用代码中的文本插件填充了占位符。

希望它有所帮助。