Форма модели 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']

Правильный ли это способ сделать это - или есть какие-то проблемы, о которых я должен знать?

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