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)
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")
]