form.get_user() 在 Django 中返回 None
form.get_user() returning None in Django
为什么 form.get_user()
在 if form.is_valid()
语句中 return 是一个值,而 form.get_user()
在语句 return 之外 None
传递给表单的值:{username='sheriffcarlos', password='Iamc@tbug'}
示例 1:
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login
import logging
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(request, request.POST)
if form.is_valid():
user = form.get_user()
logger.info(user) #Logs Sheriffcarlos
else:
#Do Something Else
#Do Something
示例 2:
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login
import logging
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(request, request.POST)
user = form.get_user()
logger.info(user) #Logs None
if form.is_valid():
#Do something
else:
#Do Something Else
#Do Something
因为get_user()
方法只有returns user_cache
。事实上,在 source code [GitHub] 中,我们看到:
def get_user(self):
return self<b>.user_cache</b>
user_cache
在构造函数中设置为 None
,并填充用户,如果凭据在 clean
方法中匹配:
def clean(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
if username is not None and password:
self<b>.user_cache = authenticate(self.request, username=username, password=password)</b>
if self.user_cache is None:
raise self.get_invalid_login_error()
else:
self.confirm_login_allowed(self.user_cache)
return self.cleaned_data
这个clean()
方法在你可以.is_valid()
时被触发,从此表单会先验证字段,然后清理字段,最终清理整个对象。事实上,如果我们查看 source code of the Form
class [GitHub],我们会看到:
@property
def <b>errors</b>(self):
"""Return an ErrorDict for the data provided for the form."""
if self._errors is None:
self<b>.full_clean()</b>
return self._errors
def is_valid(self):
"""Return True if the form has no errors, or False otherwise."""
return self.is_bound and not <b>self.errors</b>
.is_valid()
方法因此将获得 .errors
属性,这将触发一个 full_clean()
将填充 user_cache
.
首先验证表单也是有意义的,只有当表单有效时才提供给用户。
为什么 form.get_user()
在 if form.is_valid()
语句中 return 是一个值,而 form.get_user()
在语句 return 之外 None
传递给表单的值:{username='sheriffcarlos', password='Iamc@tbug'}
示例 1:
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login
import logging
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(request, request.POST)
if form.is_valid():
user = form.get_user()
logger.info(user) #Logs Sheriffcarlos
else:
#Do Something Else
#Do Something
示例 2:
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth import login
import logging
def user_login(request):
if request.method == 'POST':
form = AuthenticationForm(request, request.POST)
user = form.get_user()
logger.info(user) #Logs None
if form.is_valid():
#Do something
else:
#Do Something Else
#Do Something
因为get_user()
方法只有returns user_cache
。事实上,在 source code [GitHub] 中,我们看到:
def get_user(self): return self<b>.user_cache</b>
user_cache
在构造函数中设置为 None
,并填充用户,如果凭据在 clean
方法中匹配:
def clean(self): username = self.cleaned_data.get('username') password = self.cleaned_data.get('password') if username is not None and password: self<b>.user_cache = authenticate(self.request, username=username, password=password)</b> if self.user_cache is None: raise self.get_invalid_login_error() else: self.confirm_login_allowed(self.user_cache) return self.cleaned_data
这个clean()
方法在你可以.is_valid()
时被触发,从此表单会先验证字段,然后清理字段,最终清理整个对象。事实上,如果我们查看 source code of the Form
class [GitHub],我们会看到:
@property def <b>errors</b>(self): """Return an ErrorDict for the data provided for the form.""" if self._errors is None: self<b>.full_clean()</b> return self._errors def is_valid(self): """Return True if the form has no errors, or False otherwise.""" return self.is_bound and not <b>self.errors</b>
.is_valid()
方法因此将获得 .errors
属性,这将触发一个 full_clean()
将填充 user_cache
.
首先验证表单也是有意义的,只有当表单有效时才提供给用户。