3

我为 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 中的某些路径就无法运行,所以我想这可能是 url 的问题,尤其是我在我的 url 中做了一些魔术。问题是:django-cms url 的有效条件应该是什么?有任何想法吗?有什么解决办法吗?以前有人遇到过这个问题吗?

4

3 回答 3

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)
于 2011-03-29T15:00:21.897 回答
0

好的。我已经为我解决了这个问题。我仍然不知道发生了什么,但也许我的回答会帮助你弄清楚;)。我使用了一种方法:

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

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

希望它以某种方式有所帮助。

于 2011-03-31T15:32:02.990 回答
0

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

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

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

并在您的模型中使用此字段。

如果这能修复它,那么可能值得在 Django-CMS 中提出一个错误。

于 2011-03-17T13:23:01.740 回答