Django: у формы GET есть ошибки "обязательное поле", а у POST нет - PullRequest
2 голосов
/ 18 мая 2011

Кодирование в Django с использованием форм. У меня проблема, когда форма GET, тогда каждое поле всегда отображается с ошибкой «Это поле обязательно для заполнения», но проблема не существует, если форма POST. Вот простой пример (частичный код), * ​​1001 *

views.py:

def login(request):        
    if request.method == 'GET':
        form = RegisterForm (request.GET)
    else:
        form = RegisterForm ()
return render_to_response('register.html', locals(), context_instance=RequestContext(request))

register.html:

<form action = "" method = "GET">
    <table style = "border: none;">
        <tr>
            <td class = "login"><strong>email:</strong></td>
            <td class = "login">{{ form.email }}</td>
            <td><span class = "error">{{ form.errors.email }}</span></td>
        </tr>

        ...
    </table>
</form>

Если вы измените все «GET» на «POST», все будет хорошо. Или же form.errors.email всегда будет выдавать «Это поле обязательно для заполнения». ошибка.

Еще одна странная вещь ... не похоже, что я вижу какие-либо объекты формы, инициируемые с помощью request.GET. В Django Book 2.0 показан только объект формы, инициированный с помощью request.POST. Есть что-то, чего я здесь не хватает?

Большое спасибо за любые советы.

РЕДАКТИРОВАТЬ: спасибо за советы от Крейга и Игнасио. Тем не менее, мой вопрос заключается в том, что независимо от того, что я делаю с этой формой, либо GET, либо POST, наличие GET в форме всегда выдает мне ошибки формы о «обязательном поле». Это механика, которую я не понимаю. Любая помощь по этому вопросу будет принята с благодарностью, спасибо.

Ответы [ 3 ]

2 голосов
/ 19 мая 2011

Если я не ошибаюсь, метод HTTP-запроса по умолчанию всегда GET, если он не указан как POST.Поэтому, когда вы получаете доступ к этому представлению (используя GET по умолчанию), вы уже удовлетворяете выражению if request.method == 'GET':, поэтому оно автоматически вызывает ошибку проверки для вставки пустых данных в поле.На самом деле вы никогда не доберетесь до else: form = RegisterForm() строк

Извлеките django-debug-toolbar , которая является очень полезной панелью инструментов и позволяет видеть ваши запросы типа и переменных запроса.

1 голос
/ 18 мая 2011

Во-первых, если вы используете логин, вы всегда должны использовать post при входе пользователя в систему.

Во-вторых, вы инициализируете пустую форму в одном месте, но не в другой области. То, что вы, вероятно, захотите, это:

    def login(request):        
        if request.method == 'POST':
             form = RegisterForm (request.POST)
             # Some logic to validate the user
        else:
             form = RegisterForm ()
             return render_to_response('register.html', locals(), context_instance=RequestContext(request))

Ваше значение действия не требуется, если вы хотите опубликовать на той же странице. Также, если вы используете POST (как вы должны), тогда вы должны использовать {% csrf_token%} в вашей форме.

0 голосов
/ 18 мая 2011

Опустить атрибут action.По умолчанию отправка осуществляется по тому же URL-адресу (если, конечно, не используется GET).

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