Предположим, у меня есть класс модели 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
будет там).
Вопросы:
- Неужели
field.initial = 'Bla'
действительно должен потерпеть неудачу в этой ситуации, или это странная ошибка в моей настройке?
- Если нет ошибки: могу ли я установить «начальные данные формы» другим способом?
- Какие альтернативы рекомендуются? В моем случае я не вижу естественного места для изменения данных в представлении, например, из-за сбоя
form.is_valid()
. (В противном случае, я думаю, я мог бы просто создать A
-экземпляр из формы и затем установить A.b='Bla'
в представлении перед сохранением?)
Примечание: популярный ответ на подобные вопросы, которые я нашел здесь, кажется, "используйте hidden
вместо disabled
", но это кажется странным? Зачем мне передавать скрытые данные взад и вперед по некоторым формам, надеясь, что пользователь не испортит данные, если у меня все равно будут данные на сервере?