首页 > 解决方案 > 如何自定义登录视图

问题描述

我正在尝试自定义 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'),

标签: pythondjangodjango-views

解决方案


[ LoginViewDjango-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'
            }
        )
    )

推荐阅读