Изменить модель администратора по умолчанию

У меня типичная модель наследования в моем проекте:

class A(models.Model):
    boolean_field = models.BooleanField(default=True)

class B(A):
    some_other_field = models.CharField()

Я хочу переопределить значение по умолчанию boolean_field в классе B, как мне это сделать?

Я думаю, что это может быть сложно сделать на уровне базы данных, поэтому, по крайней мере, я могу просто переопределить это значение по умолчанию в админке Django (я имею в виду в ModelAdmin Форма для класса B).

3 ответа

Решение

Как вы предлагаете, я думаю, что самый простой подход заключается в изменении формы модели, используемой для B модель в админке django.

Чтобы изменить начальное значение поля формы, вы можете либо переопределить поле, либо переопределить __init__ метод.

class BForm(forms.ModelForm):
    # either redefine the boolean field
    boolean_field = models.BooleanField(initial=False)

    class Meta:
        model = B

    # or override the __init__ method and set initial=False
    # this is a bit more complicated but less repetitive
    def __init__(self, *args, **kwargs):
        super(BForm, self).__init__(*args, **kwargs)
        self.fields['boolean_field'].initial = False

Использовать пользовательскую форму модели в админке django очень просто!

class BAdmin(admin.ModelAdmin):
    form = BForm

admin.site.register(B, BAdmin)
class A(models.Model):
    boolean_field = models.BooleanField(default=True)
    def __unicode__(self):
        return self. boolean_field 


class B():
    some_other_field = models.CharField()
    default_fiel_from_bool = models.ForeignKey(A)

Из этого ответа самый простой способ, который я нашел, - переопределить функцию get_changeform_initial_data.

Вот как я применил это к своему проекту.

В этом примере у меня есть класс ORM с именем Step и класс Admin с именем StepAdmin. Функция get_latest_step_order получает step_order из последнего объекта в таблице.

Переопределив функцию get_changeform_initial_data в классе администратора, я могу установить порядок шагов для каждого нового объекта, созданного на экране администратора.

class Step(models.Model):
    step_name = models.CharField(max_length=200)
    step_status = models.ForeignKey(StepStatus, null=True)
    step_order = models.IntegerField()


def get_latest_step_order():
    return Step.objects.latest('step_order').step_order+1

class StepAdmin(admin.ModelAdmin):
    fields = ["step_name","step_status","step_order"]

    def get_changeform_initial_data(self, request):
        return {
            'step_order': get_latest_step_order()
        }
Другие вопросы по тегам