Как мне динамически исключить немодельное поле из админа? - PullRequest
2 голосов
/ 02 февраля 2010

Я добавил настраиваемое поле в ModelForm для использования в администраторе:

class MyModel(models.Model):
    name = models.CharField(max_length=64)
     ...etc...

class MyModelAdminForm(forms.ModelForm):
    dynamicfield = forms.IntegerField()

    def __init__(self, *args, **kwargs):
        super(MyModelAdminForm, self).__init__(*args, **kwargs)
        if 'instance' in kwargs:
            #remove dynamicfield from the form, somehow?

    def save(self, *args, **kwargs):
        #do something with dynamicfield
        super(MyModelAdminForm, self).save(*args, **kwargs)

    class Meta:
        model = MyModel

class MyModelAdmin(admin.ModelAdmin):
    form = MyModelAdminForm

admin.site.register(MyModel, MyModelAdmin)

Цель этого поля - собрать дополнительные данные, необходимые при первоначальном создании объекта.Поэтому он должен появляться только при создании нового объекта (проверка на «экземпляр»).

У меня проблема с удалением поля при редактировании существующего объекта.Я пробовал:

self.fields['dynamicfield'].widget = self.fields['dynamicfield'].hidden_widget()

, но это избавляет только от поля ввода текста, а не от метки.

Я также пробовал вариации на них (также используя base_fields вместополя, перед вызовом super()):

del self.fields['dynamicfield'] #yields error:

TemplateSyntaxError at /admin/db/myapp/mymodel/6/
Caught an exception while rendering: Key 'dynamicfield' not found in Form


self.fields['dynamicfield'].hidden = True #Does nothing.

self.fields['dynamicfield'] = None #yields error:

TemplateSyntaxError at /admin/db/catalog/product/6/
Caught an exception while rendering: 'NoneType' object has no attribute 'label'    

Выполнение этих до вызова super () также пыталось, но также не удавалось:

del self.base_fields['dynamicfield'] #yields error:
TemplateSyntaxError at /admin/db/myapp/mymodel/6/
Caught an exception while rendering: Key 'dynamicfield' not found in Form

Ответы [ 2 ]

0 голосов
/ 02 февраля 2010

Если удаление не работает (что я не знаю почему), как насчет динамического добавления?

def __init__(self, *args, **kwargs):
    super(MyModelAdminForm, self).__init__(*args, **kwargs)
    if 'instance' not in kwargs:
       self.fields['dynamicfield'] = forms.IntegerField()

Здесь также есть ссылка о том, как создать динамические формы .(Я думаю, что даже парень, который начал Django?)

0 голосов
/ 02 февраля 2010

Попробуйте это:

    def __init__(self, *args, **kwargs):

        if 'instance' in kwargs:
            del self.base_fields['dynamicfield']
        super(MyModelAdminForm, self).__init__(*args, **kwargs)
...