Администратор Django - удаляет поле при редактировании объекта

У меня есть модель, которая доступна через администраторскую область Django, что-то как следующее:

# model
class Foo(models.Model):
    field_a = models.CharField(max_length=100)
    field_b = models.CharField(max_length=100)

# admin.py
class FooAdmin(admin.ModelAdmin):
    pass

Скажем, то, что я хочу показать field_a и field_b, если пользователь добавляет объект, но только field_a, если пользователь редактирует объект. Существует ли простой способ сделать это, возможно, с помощью полевого атрибута?

Если, если прибывает в него, я мог бы взломать решение JavaScript, но это не чувствует себя хорошо, чтобы сделать это вообще!

6
задан John McCollum 19 May 2010 в 15:23
поделиться

1 ответ

Вы можете создать пользовательскую ModelForm для администратора, чтобы бросить поле в __init__

class FooForm(forms.ModelForm):
    class Meta(object):
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            # Since the pk is set this is not a new instance
            del self.fields['field_b']

class FooAdmin(admin.ModelAdmin):
    form = FooForm

EDIT: Пользуясь подсказкой из комментария Джона о том, чтобы сделать поле только для чтения, вы можете сделать его скрытым и переопределить clean, чтобы значение не менялось.

class FooForm(forms.ModelForm):
    class Meta(object):
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooForm, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            # Since the pk is set this is not a new instance
            self.fields['field_b'].widget = forms.HiddenInput()

    def clean_field_b(self):
        if self.instance and self.instance.pk:
            return self.instance.field_b
        else:
            return self.cleaned_data['field_b']  
6
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: