首页 > 解决方案 > 为什么定制的 django 登录表单需要 1 个位置参数但给出了 2 个

问题描述

我正在尝试自定义 django 登录表单。但它会在 /login/ __init__() 处引发类似 TypeError 的错误,需要 1 个位置参数,但给出了 2 个。我创建了自己的表单,而不是使用 django 内置的表单。我的项目结构如下所示

project_name
 apps
  app1
  app2
static
templates
  app1
    login.html
  app2

app1 包含基本的主页、登录、注册模板文件 url.py里面的文件 app1 看起来像这样

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文件位于 templates/app1/login.html 下,其模板如下所示。

{% 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文件看起来像这样

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)

标签: djangodjango-formsdjango-authenticationdjango-login

解决方案


你用LoginView错了方法,你需要添加.as_view()将基于类的视图转换为函数,比如:

app_name  = 'basics'

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

推荐阅读