python - 如何自定义登录视图
问题描述
我正在尝试自定义 LoginView 以使用我创建的表单,但在尝试进入登录页面时出现错误。我收到了这个 TypeError: init () got an unexpected keyword argument 'request'。
Traceback (most recent call last):
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/decorators/debug.py", line 76, in sensitive_post_parameters_wrapper
return view(request, *args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/utils/decorators.py", line 130, in _wrapped_view
response = view_func(request, *args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/utils/decorators.py", line 43, in _wrapper
return bound_method(*args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
response = view_func(request, *args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/contrib/auth/views.py", line 63, in dispatch
return super().dispatch(request, *args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/generic/base.py", line 97, in dispatch
return handler(request, *args, **kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/generic/edit.py", line 133, in get
return self.render_to_response(self.get_context_data())
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/contrib/auth/views.py", line 96, in get_context_data
context = super().get_context_data(**kwargs)
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/generic/edit.py", line 66, in get_context_data
kwargs['form'] = self.get_form()
File "/mnt/c/Users/Ghosted/Desktop/projects/helloWorld/lib/python3.7/site-packages/django/views/generic/edit.py", line 33, in get_form
return form_class(**self.get_form_kwargs())
TypeError: __init__() got an unexpected keyword argument 'request'
这是创建的表单
class LoginForm(forms.Form):
username = forms.CharField(label='',
widget=forms.TextInput(
attrs = {
'placeholder': 'username or email',
}
))
password = forms.CharField(label='',
widget=forms.PasswordInput(
attrs = {
'placeholder': 'password'
}
))
我想在django.contrib.auth.views的 LoginView 中使用它
在views.py
from .forms import LoginForm
from django.contrib.auth.views import LoginView
class CustomLoginView(LoginView):
template_name = 'login.html'
form_class = LoginForm
在 urls.py 中:
path('login/', views.CustomLoginView.as_view(), name='login'),
解决方案
[ LoginView
Django-doc]是一个使用已修改表单的视图。该表单使用request
参数。因此,您不能简单地将其替换为任何其他形式。
但是,您可以从AuthenticationForm
[Django-doc]子类化,然后它会正常工作,因为您只修改了字段:
from django import forms
from django.contrib.auth.forms import AuthenticationForm
class LoginForm(AuthenticationForm):
username = forms.CharField(
label='',
widget=forms.TextInput(
attrs = {
'placeholder': 'username or email',
}
)
)
password = forms.CharField(
label='',
widget=forms.PasswordInput(
attrs = {
'placeholder': 'password'
}
)
)
推荐阅读
- flutter - 如何在颤动的卡片视图中添加 onTap 监听器
- mongodb - MongoDB聚合数据
- javascript - Jquery TipTip 中的位置顶部无法正常工作
- pdf - 当我尝试在 VB6 中将水晶报表 8.5 导出为 PDF 时,出现错误“找不到文件”
- google-bigquery - BigQuery - 使用 REPEATED RECORD 字段创建视图
- php - 如何使用 NGINX PHP Web 服务提高 AWS EC2 的安全性
- python - 导入numpy时来自pylint的递归错误
- python - 在我的 venv 中升级 pip 会引发错误
- java - 为什么 Java 和 Go 都在写之前锁定套接字?
- javascript - 如何在抽屉 headerRight 图标按钮中打开模式?