Форма модели Django с полем, не существующим в модели
Я использую Django 3.2
У меня есть такая модель:
class BannedUser(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="ban_info")
reason = models.PositiveSmallIntegerField(choices=BANN_REASON_CHOICES)
banned_at = models.DateTimeField(auto_now_add=True)
expiry_date = models.DateField(null=True, blank=True, help_text=_('Date on which ban expires'))
Я хочу создать форму, которая вместо того, чтобы просить пользователя выбрать дату, просто просит пользователя выбрать продолжительность запрета. Затем форма будет вычислять дату истечения_срока в методе clean()
.
BAN_DURATION_3_DAYS=3
# ...
BAN_DURATION_CHOICES = (
(BAN_DURATION_3_DAYS, _('3 Days')),
# ...
)
class BannedUserForm(forms.ModelForm):
class Meta:
model = BannedUser
fields = ['reason', 'ban_till']
Поле формы ban_till
представляет собой PositiveInteger, которое отображается на количество дней. Затем предполагается вычислить дату истечения_срока от сегодняшнего дня путем смещения целочисленной суммы.
Полагаю, что одним из способов было бы:
- создайте динамическое поле
ban_till
- добавить поле
expiry_date
в список полей формы (но каким-то образом предотвратить его отображение) - в методе
clean()
формы вычислить дату истечения срока действия и обновить это поле
Как создать форму для отображения поля, не существующего в модели?
Мое решение:
class BannedUserForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
self.fields['ban_till'] = forms.IntegerField(widget=forms.ChoiceField())
super().__init__(*args, **kwargs)
class Meta:
model = BannedUser
fields = ['reason']
Правильный ли это способ сделать это - или есть какие-то проблемы, о которых я должен знать?