django - 为什么定制的 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)
解决方案
你用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")
]
推荐阅读
- sparql - Querying dbpedia, not getting expected result not sure what's the mistake
- javascript - Looping between colors in D3 Javascript
- r - 分层/嵌套引导方法
- android - Android Studio 3.1 同步失败,未解决的依赖项
- android - 无法通过 Volley 连接到本地主机
- r - 如何取消嵌套不规则的 JSON 数据
- oracle - 实现一个按函数值递增的序列
- java - Java Stream 收集方法
- flutter - Flutter - 是否可以在没有提供程序的情况下使用 BLoC?
- python - 如何在 Python 中使用 Oxford API 时仅打印单词的含义?