Изменить модель администратора по умолчанию
У меня типичная модель наследования в моем проекте:
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()
}