Поле формы модели Django: использовать отключенные, но все еще значения в формате pase (рассчитанные) для form.is_valid () - PullRequest
0 голосов
/ 09 июля 2019

Предположим, у меня есть класс модели A с обязательным текстовым полем b (и другими полями).

Я хочу создать формуляр модели , где при определенных обстоятельствах (определенных в __init__ формы) рассчитывается значение b, которое не отображается в форме. Кажется, что установка disabled - это путь, который, согласно этой записи документа , будет игнорировать любое переданное значение, но вместо этого использовать «исходные данные формы». Однако следующее не делает то, на что я надеялся:

class A(models.Model):
    b = models.TextField()
    c = ... 

class MyForm(forms.ModelForm):
    class Meta:
        model = A
        fields = ('b', 'c', 'd')
    def __init__(self, *args, **kwargs):
        if complicated_test(*args, **kwargs):
            field = self.fields['b']
            field.disabled = True
            field.initial = 'Bla'

Это отключает поле, но, похоже, игнорирует заданное вручную значение Bla, что в моем случае приведет к сбою form.is_valid() (поскольку моя модель действительно ожидает, что Bla будет там).

Вопросы:

  1. Неужели field.initial = 'Bla' действительно должен потерпеть неудачу в этой ситуации, или это странная ошибка в моей настройке?
  2. Если нет ошибки: могу ли я установить «начальные данные формы» другим способом?
  3. Какие альтернативы рекомендуются? В моем случае я не вижу естественного места для изменения данных в представлении, например, из-за сбоя form.is_valid(). (В противном случае, я думаю, я мог бы просто создать A -экземпляр из формы и затем установить A.b='Bla' в представлении перед сохранением?)

Примечание: популярный ответ на подобные вопросы, которые я нашел здесь, кажется, "используйте hidden вместо disabled", но это кажется странным? Зачем мне передавать скрытые данные взад и вперед по некоторым формам, надеясь, что пользователь не испортит данные, если у меня все равно будут данные на сервере?

1 Ответ

0 голосов
/ 10 июля 2019

Глядя на источник, кажется, что

  • Как указано в документе, упомянутом в вопросе, cleaned_data действительно получает свое значение из значения initial формы для поля формы disabled.
  • Однако форма модели не использует это значение cleaned_data для поля disabled, , а скорее значение default модели (если оно существует).

Так что кажется, что вместо этого нужно использовать скрытое поле, что кажется немного глупым ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...