Search code examples
djangodjango-formsdjango-authenticationdjango-login

Why customized django login form thows takes 1 positional argument but 2 were given


I was trying to customized django login form. but it throws error like this TypeError at /login/ __init__() takes 1 positional argument but 2 were given. I have created my own form and not using django built in forms. My Project structure looks like this

project_name
 apps
  app1
  app2
static
templates
  app1
    login.html
  app2

app1 contains the basic home, login, signup template file url.py file inside app1 looks like this

from django.urls import path
from .views import home
from django.contrib.auth import views as auth_views

app_name  = "basics"
urlpatterns = [
    path('home/', home, name="home_page"),
    path('login/', auth_views.LoginView,{'template_name': 'basics/login.html'}, name="login")
]

login.html file resides under templates/app1/login.html and its template looks like this.

{% extends 'basics/home.html' %}

{% block body %}
{% load static %}
<script src="{% static 'js/login.js' %}"></script>


<div class="container">
    <div class="row">
        <div class="col-sm-9 col-md-7 col-lg-5 mx-auto">
            <div class="card card-signin my-5">
                <div class="card-body" style="background-color: azure">
                    <h3 class="card-title text-center">Log In</h3>
                    <br>
                    <br>
                    <p class="text-center">How did you signup?</p>
                    {{ error }}
                    <div class="main" id="mainForm">
                        <br>
                        <form class="form form-group" method="POST" action="{% url 'django.contrib.auth.views.login' %}">
                            {% csrf_token %}
                            <input name ="username" class="form-control" placeholder="Enter Username" required="required">
                            </br>
                            <input name="password" class="form-control" placeholder="Enter Password" type="password"
                                required="required">
                            </br>
                            <button class="btn btn-block btn-dark btn-sm" type="submit">Submit</button>
                            <br>
                            <a href="#" class="text-center" id="backlink">back</a>
                        </form>
                    </div>
                    <div class="dummybutton">
                        </br>
                        <button class="btn btn-sm btn-block emailbutton" style="background-color: skyblue">Email</button>
                        <button class="btn btn-sm btn-block facebookbutton" style="background-color:aqua">Facebook</button>
                        </br>
                    </div>

                    <br>
                    <br>
                    <br>
                </div>
            </div>
            <p class="text-center">Dont have a Profile? <a href="#">Sign up </a>now</p>
        </div>
    </div>
</div>
{% endblock body %}

view.py file looks like this

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.contrib.auth import authenticate, login as login_check

def home(request):
    result = {}
    return render(request, 'basics/home.html', result)

def login(request):
    result = {'error': 'No error'}
    if request.method == "POST":
        username = request.POST["username"]
        password = request.POST["passsword"]
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login_check(request, user)
            redirect('home/')
        else:
            result = {'error':'Invalid User'}
            return render(request, 'basics/home.html', result)            
    return render(request, 'basics/home.html', result)

Solution

  • You use the LoginView the wrong way, you need to add .as_view() to convert the class-based view to a function, like:

    app_name  = 'basics'
    
    urlpatterns = [
        path('home/', home, name="home_page"),
        path('login/', auth_views.LoginView.as_view(template_name='basics/login.html'), name="login")
    ]