#django #forms
#django #формы
Вопрос:
У меня есть форма с полем «статус», которое будет установлено представлением в зависимости от значения некоторых полей моей формы
возможно ли это сделать ДО form.is_valid() (иначе форма не будет действительной)?
единственный способ, которым я могу это сделать, — оставить поле «статус» пустым, но это не кажется хорошим дизайном
определение метода clean (), который устанавливает эти поля, является лучшим решением?
Ответ №1:
Если поле состояния не предназначено для установки пользователем, заполняющим форму, его, вероятно, вообще не должно быть в форме.
Если это значение позже используется при создании / обновлении экземпляра модели или чего-то еще, то было бы лучше просто включить значение, определенное вашим представлением, в метод сохранения формы, например form.save(status=my_status)
(если это a ModelForm
) или при создании экземпляра вашей модели, в противном случае.
Если пользователь вводит статус, то вы можете просто использовать пользовательский clean()
метод, который гарантирует, что это приемлемое значение.
Комментарии:
1. Я хочу, чтобы поле было доступно для редактирования (например, в admin) и не могло быть пустым (даже в admin)… итак, form.save(status=my_status) кажется хорошим решением, за исключением того, что оно не будет работать, потому что я должен запустить form.is_valid() раньше, и это приведет к сбою. Я что-то упускаю?
2. @LuisFernando, похоже, что здесь может быть какая-то путаница между моделью и формой? В вашей модели может быть обязательное поле, которое не включено в вашу форму — вам просто нужно обязательно установить его перед сохранением экземпляра модели (например, если вы используете опцию сохранения, о которой я говорил). Если вы используете ModelForm и не хотите включать это поле, вы можете легко исключить его из определения ModelForm: docs.djangoproject.com/en/dev/topics/forms/modelforms /…
Ответ №2:
Затем вы должны инициализировать форму с этим значением статуса, а затем скрыть поле.
class StatusForm(forms.ModelForm):
def __init__(self, *arg, **kwargs):
super(StatusForm, self).__init__(*arg, **kwargs)
# set needed value here and hide field
Комментарии:
1. Я считаю, что OP хочет использовать значения, представленные в форме, для определения статуса, поэтому установка его в
init
методе не будет работать, если он не использует необработанные данные POST (что, как правило, было бы плохим планом).