简体   繁体   中英

'function' object has no attribute 'get' error in django

greetings dear django experts, i am having an issue with my website i am using the defualt login view in django from

from django.contrib.auth import views as auth_views

the code is working
like this inside the urls.py file:

from django.contrib.auth import views as auth_views

path('login/',auth_views.LoginView.as_view(template_name='website/login.html'), name='login-page'),

but using this methode i don't have a view inside my views.py file. the problem is i need to define a view inside my viwes.py to record logs for any one accessing this page the problem is when i tried the following code i get the error "'function' object has no attribute 'get'" 错误快照

the code that gives me the error is as the following: views.py

from django.contrib.auth import views as auth_views  

def login(request):
    ip = get_client_ip(request)
    logger.info(f'user access: {request.user} via ip:{ip}')
    return auth_views.LoginView.as_view(template_name='website/login.html')

urls.py

 path('login/',views.login, name='login-page'),

.LoginView.as_view() does not process the request, it simply returns a function that will dispatch the request, you thus need to call the function that is the result of .as_view(…) with the request as parameter:

from django.contrib.auth import views as auth_views  

def login(request):
    ip = get_client_ip(request)
    logger.info(f'user access: {request.user} via ip:{ip}')
    return auth_views.LoginView.as_view(template_name='website/login.html')

That being said, it looks a bit odd to do this. Why not just subclass the LoginView and register that view?

You thus can do this with:

# appname/views.py

from django.contrib.auth.views import LoginView

class MyLoginView():
    template_name='website/login.html'

    def (self, request, *args, **kwargs):
        super().setup(request, *args, **kwargs)
        ip = get_client_ip(request)
        logger.info(f'user access: {request.user} via ip:{ip}')

and then register your MyLoginView instead:

from appname.views import 

path('login/', , name='login-page'),

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM