валидация и выполнение
Без выполнения или изменения состояния в форме clean()
. Пожалуйста. Функция clean()
формы должна работать только с данными на форме, а не где-либо еще.
Если происходит изменение состояния, оно должно быть в функции представления внутри не-GET обработчика запроса.
Обычно я инкапсулирую логику такого типа в форму. Поскольку вы используете форму для проверки данных, вы также используете ее для отправки данных. Это имеет смысл, поскольку форма уже знает о данных, их типах и т.д. (у нее есть словарь clean_data
).
Но обработка данных и изменение состояния вашего приложения не должны находиться непосредственно внутри вашей логики валидации (например, в методе clean
). Вы должны поместить ее в дополнительный метод вашей формы - как ModelForm
делает это с помощью метода save()
.
Поэтому я предлагаю иметь дополнительный метод с именем save()
(если метод действительно сохраняет вашу обработку в REST-сервис) или post_result()
или что-то подобное, что подходит лучше.
Вот пример:
# forms.py
class ValidateDataForm(forms.Form):
...
def clean(self):
# validation logic
def save(self):
post_results_to_service(self.cleaned_data)
# views.py
def view(request):
if request.method == 'POST':
form = ValidateDataForm(request.POST)
if form.is_valid():
form.save()
else:
form = ValidateDataForm()
Выше предполагается, что REST-сервис изменяет состояние для вашего приложения, например, он реализует обработку состояния. приложения, например, реализует некоторую бизнес-логику. Если это не так и вы используете сервис только в качестве проверки входных данных на вашей форме - и используете данные формы для чего-то другого - я бы посоветовал что-то другое. другое.
В этом случае код должен идти в метод clean()
, как вы предложили
в вашем втором примере кода.