Я внедрил логин пользователя в Django, используя следующий код;Django test client возвращает анонимного пользователя после входа в систему
В моем urls.py;
.
.
.
url(r'^login/', UserLogin.as_view(), name='userlogin'),
.
.
На мой взгляд.py;
.
.
from django.contrib.auth.forms import AuthenticationForm
.
.
.
class UserLogin(FormView):
form_class = AuthenticationForm
template_name = "auth/login.html"
def get_success_url(self):
return reverse('userhome', kwargs={'pk': self.request.user.id})
.
.
.
и мой auth/login.html is;
{% block head %}
<title>Open Radio | Login</title>
{% endblock %}
{% block body %}
<header>
<h1>Open Radio</h1>
<h2>Login Page</h2>
</header>
<section>
{% if form.errors %}
<p>Your username and password didn't match, please try again. </p>
{% endif %}
<form method="post" action=".">
{% csrf_token %}
<p>
<label for="id_username">Username:</label>
{{ form.username }}
</p>
<p>
<label for="id_password">Password:</label>
{{ form.password }}
</p>
{% if next %}
<input type="hidden" name="next" value="{{ next }}" />
{% endif %}
<input type="submit" value="login" />
</form>
</section>
{% endblock %}
Это работает и ведет меня к домашней странице пользователя, которую я определил.
Но когда я запускаю следующий тест;
class TestLoginPage(TestCase):
.
.
.
def test_page_logs_in(self):
"""
Tests if the login page actually logs a user in
"""
username = "someusername"
password = "somepassword"
user = User(username=username,
password=password)
user.save()
response = self.client.post(reverse("userlogin"),
{"username":username,
"password":password},
follow=True)
assert response.context["user"].is_authenticated()
Я получаю следующий сбой;
self = <stationrunner.tests.TestLoginPage testMethod=test_page_logs_in>
def test_page_logs_in(self):
"""
Tests if the login page actually logs a user in
"""
username = "someusername"
password = "somepassword"
user = User(username=username,
password=password)
user.save()
response = self.client.post(reverse("userlogin"),
{"username":username,
"password":password},
follow=True)
> assert response.context["user"].is_authenticated()
E AssertionError: assert <bound method AnonymousUser.is_authenticated of <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>>()
E + where <bound method AnonymousUser.is_authenticated of <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>> = <SimpleLazyObject: <django.contrib.auth.models.AnonymousUser object at 0x7f54b5433a50>>.is_authenticated
Может кто-нибудь, пожалуйста, объясните, почему это происходит
Большое спасибо. Проблема теперь решена, но теперь у меня есть новая. 'E NoReverseMatch: Реверс для 'userhome' с аргументами '()' и ключевыми аргументами '{' pk ': None}' не найден. 1 образец (ы): ['(? P \\ d +) /'] 'Что это значит? Нужно ли мне создавать pk при создании? Это не может/не должно быть так правильно !? Или я пропустил что-то еще? –
Нужно больше контекста: эта ошибка не исходит от кода, показанного здесь. Где вы вызываете 'reverse' (или используете тег' {% url%} 'для 'userhome'? Это может быть лучше, как новый вопрос. –
Его там. Это происходит из метода 'get_success_url()' метода UserLogin (см. Мой view.py). Проблема заключается не в том, когда я запускаю свой проект. Как сказано, это прекрасно работает. Его когда я проверяю. .i.e. после того, как я создал объект так, как вы его научили, после выполнения своих работ представление UserLogin не может перейти к его URL-адресу успеха, поскольку у созданного объекта нет pk. Надеюсь, я поняла. –