Может ли кто-нибудь помочь мне выяснить, почему значения 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. После отправки данных из выпадающего списка они сохраняются в базе данных, но не обновляются в выпадающем списке. Прикрепляю изображения
Как вы можете видеть, дефаут отображается как 1 день. Я меняю его на два дня и нажимаю сохранить, все равно показывает 1 день. Любая помощь будет очень признательна.