Когда я должен отправить результаты моей формы Django? - PullRequest
1 голос
/ 20 августа 2010

Содержимое моей формы должно быть отправлено на другой сервер приложений для проверки и выполнения (в частности, я вызываю веб-службу RESTful с опубликованными значениями в форме).Служба вернет ошибку 200 SUCCESS или 400/409 с телом, описывающим точные ошибки поля.

Когда мне следует подавать эту заявку?Должен ли я сделать это в представлении:

if form.is_valid:
    result = submit_to_service(POST)
    if result.code in (400, 409):
        somehow_set_errors_on_the_form(form)
    else:
        go_on...

Или в методе Form.clean?

def clean(self):
    result = submit_to_service(POST)
    if result.code in (400, 409):
        for field in result.errors:
            self._errors[field].append(result.errors[field])
    else:
        pass

Что из этого яснее?

Ответы [ 2 ]

2 голосов
/ 20 августа 2010

проверка и исполнение

Нет выполнения или изменений с сохранением состояния в форме clean(). Пожалуйста. Форма clean() должна связываться только с данными в форме, а не где-либо еще.

Если есть изменение с состоянием, оно должно быть в функции представления внутри обработчика запроса не-GET.

0 голосов
/ 20 августа 2010

Я обычно заключаю этот тип логики в форму. Поскольку вы используете форму для проверки данных, вы также используете ее для отправки данных. Это имеет смысл, потому что форма уже знает о данных, их типах и т. Д. (Имеет словарь cleaned_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(), как вы предложили во втором примере кода.

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