Custom ModelAdmin: разрешить валидацию класса администратора, чтобы игнорировать поля в наборе полей? - PullRequest
0 голосов
/ 15 ноября 2011

Я пишу небольшое приложение, чтобы разрешить поле общего доступа AddThis в списке изменений администратора django, чтобы позволить пользователю поделиться объектом, который они редактируют в настоящее время (а также увидеть счет общего ресурса):

enter image description here

Взяв в качестве примера простой BlogEntry, я создал собственный ModelAdmin:

class AddThisAdmin(admin.ModelAdmin):
    addthis_config = {
        'title_field' : None,
        'description_field' : None, 
        'url_field' : None,
        'image_field' : None,
    }

    def get_form(self, request, obj=None, *args, **kwargs):
        metaform = super(AddThisAdmin, self).get_form(request, obj, **kwargs)
        if obj:
            # Grab users config and find the fields they specified ...
            metaform.base_fields['add_this'] = AddThisField(self.add_this)
        return metaform

Что унаследовано у пользователей BlogEntryAdmin примерно так:

class BlogEntryAdmin(admin.ModelAdmin, AddThisAdmin):
    addthis_config = {
        'title_field' : 'blog_title',
        'description_field' : 'blurb',
    }

, где addthis_config позволяет пользователю указать поля в своем объекте BlogEntry, из которых можно извлечь заголовок / описание / URL и изображение, используемое в AddThis. Это все работает очень хорошо, пока я не решу использовать пользовательский набор полей в BlogEntryAdmin:

class BlogEntryAdmin(admin.ModelAdmin, AddThisAdmin):
    addthis_config = {
        'title_field' : 'blog_title',
        'description_field' : 'blurb',
    }
    fieldsets = [{ ... }]

'BlogEntry.fieldsets 0 [' fields ']' относится к полю add_this, которое отсутствует в форме.

Я понимаю, что это происходит потому, что администратор django выполняет проверку наборов полей (django.contrib.admin.validation) в классе BlogEntryAdmin, прежде чем он будет фактически создан (и мое пользовательское поле вставлено).

tldr : Есть ли способ, которым я могу сказать django.contrib.admin.validation игнорировать поле в наборе полей?

Ответы [ 2 ]

2 голосов
/ 16 ноября 2011

Типичный подход заключается в предоставлении базовой формы, такой как AddThisAdminForm, которая имеет обязательные поля, и формы make других ModelAdmin наследуются от нее. Похоже, вы пытаетесь избежать этого и автоматически вставляете поля в любую используемую форму. Если вы настаиваете на таком подходе, что-то вроде следующего должно работать намного лучше:

def get_form(self, request, obj=None, **kwargs):
    ModelForm = super(AddThisAdmin, self).get_form(request, obj, **kwargs)
    class AddThisForm(ModelForm):
        add_this = AddThisField(self.add_this)

    return AddThisForm
1 голос
/ 16 ноября 2011

Это не задокументировано, но вы можете использовать метод get_fieldsets для определения ваших наборов полей. В качестве примера рассмотрим, как Django изменяет наборы полей в UserAdmin при добавлении новых пользователей.

Я не проверял это, но я полагаю, что это позволит избежать проверки fieldset.

...