【Django】关于可在模板中使用的用户信息

首先

在Django中,如果想要在页面上显示当前登录用户的名称,可以使用模板中的{{ user.username }}或者{{ user.get_username }}来实现。然而,为什么可以使用这个名为user的变量,即使我没有在views.py中使用render函数将它传递给templetes,也没有重写get_context_data()方法来添加变量呢?由于对此产生了疑问,我进行了一些调查。

下面的是一个例子:

总结

在模板中可以使用的变量存储在上下文变量(context)中,格式为 context(={<变量名>: <变量>, …..}) 。此上下文变量包含以下两种类型的变量。

    1. 通过使用render函数等在views.py传递的变量,

 

    在settings.py文件中TEMPLATES选项中指定的’context_processers’指定的文件中定义的变量。

用户是与第二个说明相对应的变量,在views.py中无需指定即可使用的主要变量包括request、perm、message等。

被存储在哪里?

首先,让我们看看setting.py文件。

#
# 省略
#

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

#
# 省略
#

在setting.py文件中,被指定为TEMPLATES.OPTIONS.context_processors的文件有以下四个:
django.template.context_processors.debug
django.template.context_processors.request
django.contrib.auth.context_processors.auth……用户身份认证的位置
django.contrib.messages.context_processors.messages

用户的存储位置

#
# 省略
#

def auth(request):
    """
    Return context variables required by apps that use Django's authentication
    system.

    If there is no 'user' attribute in the request, use AnonymousUser (from
    django.contrib.auth).
    """
    if hasattr(request, 'user'):
        user = request.user
    else:
        from django.contrib.auth.models import AnonymousUser
        user = AnonymousUser()

    return {
        'user': user,
        'perms': PermWrapper(user),
    }

通过返回”用户”,使得用户可以在模板内使用。可以通过”用户.username”来提取用户对象中的username属性,或者通过实例化AnonymousUser类,并使用类内的get_user方法来调用”user.get_username”,以显示已登录用户的用户名。

请参考以下中文的本地化改写:

(仅供参考)

在底部有一个名为 “get_username” 的函数

class AnonymousUser:
    id = None
    pk = None
    username = ''
    is_staff = False
    is_active = False
    is_superuser = False
    _groups = EmptyManager(Group)
    _user_permissions = EmptyManager(Permission)

    def __str__(self):
        return 'AnonymousUser'

    def __eq__(self, other):
        return isinstance(other, self.__class__)

    def __hash__(self):
        return 1  # instances always return the same hash value

    def __int__(self):
        raise TypeError('Cannot cast AnonymousUser to int. Are you trying to use it in place of User?')

    def save(self):
        raise NotImplementedError("Django doesn't provide a DB representation for AnonymousUser.")

    def delete(self):
        raise NotImplementedError("Django doesn't provide a DB representation for AnonymousUser.")

    def set_password(self, raw_password):
        raise NotImplementedError("Django doesn't provide a DB representation for AnonymousUser.")

    def check_password(self, raw_password):
        raise NotImplementedError("Django doesn't provide a DB representation for AnonymousUser.")

    @property
    def groups(self):
        return self._groups

    @property
    def user_permissions(self):
        return self._user_permissions

    def get_user_permissions(self, obj=None):
        return _user_get_permissions(self, obj, 'user')

    def get_group_permissions(self, obj=None):
        return set()

    def get_all_permissions(self, obj=None):
        return _user_get_permissions(self, obj, 'all')

    def has_perm(self, perm, obj=None):
        return _user_has_perm(self, perm, obj=obj)

    def has_perms(self, perm_list, obj=None):
        return all(self.has_perm(perm, obj) for perm in perm_list)

    def has_module_perms(self, module):
        return _user_has_module_perms(self, module)

    @property
    def is_anonymous(self):
        return True

    @property
    def is_authenticated(self):
        return False

    def get_username(self):
        return self.username
广告
将在 10 秒后关闭
bannerAds