PlaceholderAdmin throws <lambda>() принимает ровно 1 аргумент (2 дано) - PullRequest
3 голосов
/ 16 марта 2011

Я написал плагин для 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.Вопрос в том, какие условия должны выполняться для того, чтобы URL-адреса django-cms были действительными?Есть идеи?Любые решения?У кого-нибудь была эта проблема раньше?

Ответы [ 3 ]

6 голосов
/ 29 марта 2011

Эта проблема возникает, когда вы не подклассифицируете 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)
0 голосов
/ 31 марта 2011

Хорошо.Я решил проблему для себя.Я до сих пор не знаю, что происходило, но, возможно, мой ответ поможет вам разобраться;).Я использовал метод:

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

, который заменил одно текстовое поле в редакторе TinyMCE.Когда я удалил весь метод, проблема исчезла.Если у меня будет время, может быть, я попытаюсь углубиться в это.Я до сих пор не уверен, что это была единственная проблема.У меня есть предчувствие, что это также может быть что-то с данными, потому что я заполнил заполнитель текстовым плагином из кода.

Надеюсь, это поможет как-то.

0 голосов
/ 17 марта 2011

Что ж, похоже, это ошибка в Django-CMS.Я никогда не использовал его, но, глядя на код, ясно, что поле формы по умолчанию для PlaceholderField создает лямбду, которая принимает один аргумент - набор запросов, но функция рендеринга для этого поля формы вызывает лямбду с двумя аргументами -request и queryset.

Вероятно, лучший способ исправить это - определить собственный подкласс PlaceholderField, который переопределяет метод formfield, чтобы он возвращал правильную лямбду:

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

и вместо этого используйте это поле в вашей модели.

Если это исправит ошибку, вероятно, стоит поднять ошибку в Django-CMS.

...