Как решить ошибку атрибута в Django? - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь войти в систему, но получаю ошибку атрибута.

Вот мой forms.py :

class Login(forms.Form):
    email = forms.EmailField(max_length=250)
    password = forms.CharField(widget=forms.PasswordInput)

    def login_user(self):
        email = self.cleaned_data['email']
        password = self.cleaned_data.get('password')
        user = authenticate(email=email, password=password)
        if user in User.objects.all():
            login(self, user)
        else:
            return render(self, 'todoapp/waiting_2.html')

Вот мои views.py :

def login_user(request):
    if request.method == 'POST':
        login_form = Login(request.POST)
        if login_form.is_valid():
            login_form.login_user()
            login_form.save()
            return HttpResponseRedirect(reverse('dashboard'))
        else:
            return render(request, 'todoapp/waiting_2.html')
    return render(request, 'registration/login.html', {'form': Login()})

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

AttributeError at /login/

'Login' object has no attribute 'session'

Traceback:

File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
  41.             response = get_response(request)

File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/gblp250/PycharmProjects/assignment/todoapp/views.py" in login_user
  48.             login_form.login_user(request)

File "/home/gblp250/PycharmProjects/assignment/todoapp/forms.py" in login_user
  27.             login(self, request, user)

File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py" in login
  126.     if SESSION_KEY in request.session:

Exception Type: AttributeError at /login/
Exception Value: 'Login' object has no attribute 'session'

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

Здесь есть несколько ошибок. Основным является попытка рендеринга в форме метода login_user. Помимо всего прочего, вы пытаетесь передать self в качестве параметра запроса для рендеринга, что не имеет смысла.

Удалите все это, если / еще. Вам не нужно оказывать; но также обратите внимание, что ваше условие if излишне неэффективно Если у вас есть пользователь, это обязательно пользователь.

Наконец, настоящая причина вашей ошибки, когда вы снова пытаетесь передать self вместо запроса, но на этот раз в качестве параметра login. Этот код принадлежит в представлении.

И, наконец, форма не является ModelForm, поэтому метод сохранения отсутствует.

Итак, форма:

def login_user(self):
    email = self.cleaned_data['email']
    password = self.cleaned_data.get('password')
    return authenticate(email=email, password=password)

и просмотр:

    if login_form.is_valid():
        user = login_form.login_user()
        if user:
            login(request, user)
        return HttpResponseRedirect(reverse('dashboard'))

Хотя в этот момент вы также можете перенести всю эту логику в представление.

0 голосов
/ 11 марта 2019

login() получить в качестве первого аргумента запрос, вы вызываете его с формой в качестве первого аргумента. https://docs.djangoproject.com/en/2.1/topics/auth/default/#django.contrib.auth.login

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