Django admin - удалить поле при редактировании объекта - PullRequest
6 голосов
/ 19 мая 2010

У меня есть модель, которая доступна через админку 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, если пользователь редактирует объект. Есть ли простой способ сделать это, возможно, с помощью атрибута fields?

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

Ответы [ 2 ]

6 голосов
/ 19 мая 2010

Вы можете создать пользовательский 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

РЕДАКТИРОВАТЬ: Получив подсказку из комментария Джона о создании поля только для чтения, вы можете сделать это скрытое поле и переопределить очистку, чтобы значение не изменилось.

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']  
0 голосов
/ 27 января 2017

Вы также можете сделать следующее

class FooAdmin(admin.ModelAdmin)
    def change_view(self, request, object_id, extra_context=None):       
        self.exclude = ('field_b', )
        return super(SubSectionAdmin, self).change_view(request, object_id, extra_context)

Взято отсюда Администратор Django: исключить поле только в форме изменений

...