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.

首先验证表单也是有意义的,只有当表单有效时才提供给用户。