определение значения поля в представлении перед проверкой формы

#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 (что, как правило, было бы плохим планом).