Неправильная ошибка при тестировании страницы регистрации в Django - PullRequest
0 голосов
/ 23 мая 2018

Я работаю над приложением Django.Я хочу создать страницу регистрации для нового пользователя.После того как Django получит отправленную форму и сохранит очищенные данные, я хочу проверить, существует ли уже введенное имя пользователя.если он существует, я хочу, чтобы Sjango снова отобразил страницу с сообщением об ошибке.Он отлично работает, если имя пользователя еще не существует.

Однако, когда имя пользователя существует, я получаю следующую ошибку:

ValueError at /signup/
The view users.views.user_signup didn't return an HttpResponse object. It returned None instead.
Request Method: POST
Request URL:    http://127.0.0.1:8000/signup/
Django Version: 2.0.5
Exception Type: ValueError
Exception Value:    
The view users.views.user_signup didn't return an HttpResponse object. It returned None instead.
Exception Location: /Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/site-packages/django/core/handlers/base.py in _get_response, line 139
Python Executable:  /Users/omarjandali/anaconda3/envs/MySplit/bin/python
Python Version: 3.6.2
Python Path:    
['/Users/omarjandali/Desktop/demo/mysplit',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python36.zip',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/lib-dynload',
 '/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/site-packages']

Странная вещь, которую я сейчас вижу, состоит в том, что у меня есть оператор print, который будет отображать результатызапрос, который я написал, чтобы проверить имя пользователя и если оно существует в базе данных.Когда форма отправляется, она выдает ошибку, и в трассировке моего терминала она не печатает оператор.

Я ввожу существующее имя пользователя.Следует сделать запрос и распечатать результаты.

Вот мой код:

def user_signup(request):
    if request.method == "POST":
        form = SignupForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            email = cd['email']
            username = cd['username']
            password = cd['password']
            user_taken = User.objects.filter(username = username).first()
         ** print(user_taken)
            if user_taken == None:
                print('username is good')
                secure_password = make_password(password)
                user = User.objects.create(
                    username = username,
                    email = email,
                    password = secure_password
                )
                login(request, user)
                return redirect('user_profile')
            else:
                print('username is taken')
                form = SignupForm()
                error = "Username is already taken"
                parameters = {
                  'form':form,
                  'error':error
                }
                return render(request, 'users/signup.html', parameters)
    else:
        form = SignupForm
        parameters = {
            'form':form
        }
        return render(request, 'users/signup.html', parameters)

Я поставил ** там, где должно быть напечатано выражение print:

Вот что я получаю в своем терминале:

[23/May/2018 08:39:27] "POST /signup/ HTTP/1.1" 302 0
[23/May/2018 08:39:27] "GET /profile/ HTTP/1.1" 200 960
[23/May/2018 08:39:31] "GET /logout HTTP/1.1" 301 0
[23/May/2018 08:39:32] "GET /logout/ HTTP/1.1" 302 0
[23/May/2018 08:39:32] "GET /login/ HTTP/1.1" 200 516
[23/May/2018 08:39:32] "GET /logout HTTP/1.1" 301 0
[23/May/2018 08:39:32] "GET /logout/ HTTP/1.1" 302 0
[23/May/2018 08:39:32] "GET /login/?next=/logout/ HTTP/1.1" 200 516
[23/May/2018 08:39:34] "GET /signup/ HTTP/1.1" 200 609
Internal Server Error: /signup/
Traceback (most recent call last):
  File "/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Users/omarjandali/anaconda3/envs/MySplit/lib/python3.6/site-packages/django/core/handlers/base.py", line 139, in _get_response
    "returned None instead." % (callback.__module__, view_name)
ValueError: The view users.views.user_signup didn't return an HttpResponse object. It returned None instead.
[23/May/2018 08:39:47] "POST /signup/ HTTP/1.1" 500 54487

Это даже не печать ожидаемых результатов запроса.Может ли кто-нибудь помочь мне с этим.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Вы не возвращаете ответ на POST запросы, если форма недействительна.

Обычное исправление состоит в том, чтобы сделать отступ в последних двух строках, чтобы всегда возвращать ответ в концепредставление.

def user_signup(request):
    if request.method == "POST":
        form = SignupForm(request.POST)
        ...
    else:
        form = SignupForm()   # Note you should instantiate the form instead of using the form class SignupForm 
    parameters = {
        'form':form,
    }
    return render(request, 'users/signup.html', parameters)

Чтобы выяснить, почему форма недействительна, вы можете проверить form.errors в представлении или шаблоне.

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

0 голосов
/ 23 мая 2018

Вы не получили ответ, если ваша форма недействительна.

def user_signup(request):
    if request.method == "POST":
        form = SignupForm(request.POST)
        if form.is_valid():
            # YOU code here

        parameters = {
          'form': form,
           # if you need only errors messages
           # 'error': " ".join([x for x in form.errors.values()])
          'error': form.errors.as_ul()
        }
        return render(request, 'users/signup.html', parameters)
...