Может ли кто-нибудь помочь мне выяснить, почему значения db не отображаются в форме администратора?

Я новичок, поэтому прошу помочь мне в решении этой проблемы. У меня есть поле DurationField в моем models.py. Я переопределил атрибут виджета поля в admin.py. Мне нужно поле duration как поле выбора без изменения поля DurationField в файле models.py. Поэтому я переопределил это поле с виджетом поля выбора, чтобы оно отображалось в виде выпадающего списка, ограниченного пятью днями. Теперь переходим к проблеме. Когда я нажимаю на кнопку сохранения в админке, данные сохраняются в базе данных, а виджет не обновляется с сохраненными в базе данных значениями. Выкладываю изображения и код для справки. Я застрял с этой проблемой более 5 дней. Любая помощь будет оценена по достоинству

class ManagedAccountAdmin(admin.ModelAdmin):
    form = ManagedUserAdminForm
    model = ManagedAccount
    exclude = ('customer', 'created_by', 'modified_by', 'verification_code')
    formfield_overrides = {
    models.DurationField: {"widget": forms.Select(choices=((str(i)+" day",str(i)+" Day") 
    if i==1 else ((str(i)+" days", str(i)+" Days")) for i in range(1,6)))
                           }}

def get_form(self, request, obj=None, **kwargs):
    form = super(ManagedAccountAdmin, self).get_form(request, obj, **kwargs)
    for field in form.base_fields.keys():
        form.base_fields[field].widget.can_change_related = False
        form.base_fields[field].widget.can_add_related = False
    return form

def save_model(self, request, obj, form, change):
    obj.program = form.cleaned_data.get('program')
    obj.managed_by = form.cleaned_data.get('managed_by')
    obj.created_by = request.user
    obj.duration_in_days = form.cleaned_data.get('duration_in_days')
    print("duration in save model",obj.duration_in_days)
    if change:
        obj.modified_by = request.user
        obj.save()

class ManagedUserAdminForm(forms.ModelForm):
#duration = forms.ChoiceField(choices= ((str(i)+" day",str(i)+" Day") if i==1 else ((str(i)+" days",str(i)+" Days")) for i in range(1,6)))
class Meta:
    model = ManagedAccount
    fields = ['managed_by','program','duration_in_days','is_verified','is_active','is_first_login']
    #widgets = {'duration_in_days': forms.Select(choices=DURATION_CHOICES)} #ignore commented codes as I have used in admin.py
    #widgets = {'duration_in_days': CustomDurationField()} #ignore this too

def clean_duration_in_days(self, *args, **kwargs):
    duration_in_days = self.cleaned_data.get('duration_in_days')
    print("duration in days",duration_in_days)
    print(type(duration_in_days))
    if duration_in_days < timedelta(days=1) or duration_in_days > timedelta(days=3):
        raise forms.ValidationError(
            "Minimum duration is 1 day, maximum is 3 days. Please enter in Days(D HH:MM:SS).")
    return duration_in_days

class ManagedAccount(AbstractDateBase, AbstractUserBase): #ignore indentation it is fine in my file 

managed_by = models.ForeignKey(User, on_delete=models.CASCADE,
                               limit_choices_to={'is_staff': True})
program = models.ForeignKey('rewards.Program', on_delete=models.CASCADE,
                            related_name='customer_program')
customer = models.ForeignKey('rewards.CustomerAccount', null=True,
                             blank=True,
                             on_delete=models.CASCADE)
verification_code = models.CharField(max_length=8)
duration_in_days = models.DurationField(default=datetime.timedelta(days=3))
is_verified = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_first_login = models.BooleanField(
    default=False,
    help_text='To check if the user logs in for first time')

У меня есть поле DurationField, которое я преобразовал в ChoiceField для отображения в admin.py. После отправки данных из выпадающего списка они сохраняются в базе данных, но не обновляются в выпадающем списке. Прикрепляю изображенияenter image description here

Как вы можете видеть, дефаут отображается как 1 день. Я меняю его на два дня и нажимаю сохранить, все равно показывает 1 день. Любая помощь будет очень признательна.

Вернуться на верх