I’m attempting to create a TemplateView where each subclass renders an AuthenticationForm; subclassing it and naming it UserLoginForm . This gives the User the opportunity to login with their credentials on any page they visit and be redirected to that same page after being successfully authenticated.
When validating UserLoginForm , it fails to authenticate when it reaches form.clean()
and raises self.get_invalid_login_error()
. The TestCase used to simulate this scenario creates a User, then a POST request with the same credentials is sent. What’s causing the UserLoginForm to invalidate the data passed to it and not finding the User? I’m using the default auth backend: <django.contrib.auth.backends.ModelBackend object at 0x0000019DBF5B3DC8>
Upon debugging, the database has stored the Mock User in the Test Case:
-> user_login_failed.send(sender=__name__, credentials=_clean_credentials(credentials), request=request)
(Pdb) from django.contrib.auth.models import User
(Pdb) User.objects.all()
<QuerySet [<User: User>]>
class TestTopicListMainPage__003(TestCase):
'''Verify that an anonymous user is logged into their User account'''
@classmethod
def setUpTestData(cls):
user = User.objects.create_user("User", 'secretcode')
cls.data = {
'username': "User",
'password': "secretcode"
}
def test_topics_listing_login_user(self):
response = self.client.post(
reverse("topics:listing"),
data=self.data
)
self.assertEqual(response.status_code, 200)
self.assertTemplateUsed(response, "topics/listing.html")
self.assertContains(response, "Logout")
class UserLoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values():
field.widget.attrs['placeholder'] = field.label.title()
field.widget.attrs['class'] = "login_text_widget"
class AbstractListingView(TemplateView):
template_name = "topics/listing.html"
def get_context_data(self):
context = super().get_context_data()
context['topics'] = Topic.objects.all()
context['search_form'] = SearchForm()
return context
def post(self, request):
context = self.get_context_data()
form = UserLoginForm(data=request.POST)
breakpoint();
if form.is_valid():
resolver = resolve(request.path)
login(request, form.get_user())
return HttpResponseRedirect(reverse(resolver.url_name))
return self.render_to_response(context)
class TopicsMainPage(AbstractListingView):
extra_content = {
'heading': 'Questions',
'query_links': ['interesting', 'hot', 'week', 'month']
}
def get(self, request):
query = request.GET.get('tab', None)
context = self.get_context_data()
if not query:
pass
else:
if query == "hot":
previous_days = now - datetime.timedelta(day=3)
elif query == "week":
previous_days = now - datetime.timedelta(day=7)
elif query == "month":
previous_days = now - datetime.timedelta(day=30)
now = datetime.datetime.today()
topics = context['topics'].order_by(
'-views', '-answers__topic', 'posted'
)
topics = topics.filter(posted__range=(previous_days, now))[:20]
context['topics'] = topics
response = self.render_to_response(context)
return response