Django Forms - Обработка запросов GET - PullRequest
4 голосов
/ 22 сентября 2011

У нас есть существующая форма Django, которая принимает запросы GET, чтобы позволить пользователям добавлять закладки в свои параметры запроса. Форма содержит много полей, большинство из которых являются обязательными. В форме используется полустандартный шаблон для обработки запроса, заменяя GET на POST:

if request.method == 'GET':
   form = myForm(request.GET)
   if form.isValid()
      # Gather fields together into query.
else
   form = myForm()

Проблема в том, что при первой загрузке формы в запросе GET нет ничего для заполнения обязательных полей, поэтому большая часть формы загорается с ошибками «пропущенного поля».

Установка начальных значений не работает; по-видимому, несуществующие значения в запросе GET переопределяют их.

Как мы можем избежать этого? Я почти уверен, что мы просто неправильно обрабатываем вещи, но я не могу найти пример формы, которая обрабатывает запросы GET. Мы хотим, чтобы ошибки отображались, если пользователь нажимает кнопку «Отправить», когда поля не заполнены или иным образом недействительны, но не хотим, чтобы эти ошибки отображались при первоначальном отображении формы.

Ответы [ 4 ]

4 голосов
/ 27 сентября 2011

Позиционный аргумент для подкласса forms.Form сообщает Django, что вы намереваетесь обрабатывать форму, а не просто отображать пустую форму / форму по умолчанию.Ваш if request.method == 'GET' не делает того различия, которое вы хотите, потому что обычные старые веб-запросы, набирая URL в веб-браузере или нажимая на ссылку, также являются запросами GET, поэтому request.method равно GET в любом случае.

Вам нужен какой-то дифференцирующий механизм, чтобы вы могли различить отображение формы и процесс формы.

Идеи:

Если ваша обработка выполняется с помощью.AJAX, вы можете использовать if request.is_ajax() в качестве условного выражения.

В качестве альтернативы вы можете включить токен GET, который означает, что запрос обрабатывается.Согласно этому примеру, сначала вам нужно что-то в вашей форме:

<input type="hidden" name="action" value="process_form" />

А затем вы можете посмотреть на это значение в своем представлении:

if 'action' in request.GET and request.GET['action'] == 'process_form':
    form = myForm(request.GET)
    if form.is_valid():
        # form processing code
else:
    form = myForm()

Я также дам вамстандартная, стандартная точка зрения, что обычно предпочтительнее не использовать GET для обработки формы, если вы можете помочь ей (именно потому, что вы сталкиваетесь с подобными трудностями, поскольку вы используете аномальный шаблон), но если у вас есть случай использования, когда вы действительнонужно, тогда вам действительно нужно.Вы знаете свои потребности лучше, чем я.: -)

3 голосов
/ 21 мая 2013

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

form = YourForm()
if request.POST:

вы можете сделать

if request.GET.items():
    form = YourForm(request.GET)
    if form.is_valid():
        ...

else:
    form = YourForm()

Если загрузка чистой страницы может иметь другие параметры (например, параметры отслеживания ссылок электронной почты), вы будетенеобходимо использовать методы QueryDict , чтобы проверить, есть ли какие-либо параметры вашей формы в запросе.

0 голосов
/ 21 февраля 2017

Мой первый вопрос, который я отправил в качестве комментария: почему бы просто не использовать request.POST и стандартный способ обработки данных формы?

После рассмотрения всего этого здесь, возможно, вы ищетеспособ обработки данных в строке запроса для заполнения формы.Вы можете сделать это, не используя request.GET в качестве form.data.

. В своих собственных представлениях я использую созданную мной служебную функцию для добавления начальных данных в форму из request.GET, но яне собираюсь делить эту функцию здесь.Вот подпись, хотя.initial_dict обычно request.GET.model_forms - это либо один ModelForm, либо список ModelForm.

def process_initial_data(model_forms, initial_dict):

Тем не менее, я могу обработать форму с помощью стандартной практики использования request.POST, когда форма POSTed,И мне не нужно передавать все виды информации в строке запроса URL-адреса или изменять ее с помощью JavaScript, когда пользователь вводит информацию.

0 голосов
/ 28 мая 2012

request.GET и пустой словарь при первой загрузке чистой формы.После того как вы отправите форму, request.GET будет заполнен данными ваших полей, даже если поля содержат только пустые данные.

...