Django 用户资料... 无需密码

4 投票
7 回答
7500 浏览
提问于 2025-04-11 09:23

我想创建一个用户的子集,这些用户没有登录账号……基本上是为了给照片添加一个摄影师的字段,而不需要和这个人关联一个完整的账号(因为在很多情况下,他们可能根本不会登录网站)。有一点需要注意的是,我也希望以后能为他们启用一个账号。

所以,我觉得问题变成了,如何最好地设置一个“人员”表,这个表要和用户表关联,但又不需要通过用户资料来扩展用户表。

7 个回答

3

提供你自己的身份验证方法,这样你就可以根据自己的需要来检查(或者不检查)任何东西。我们这样做是为了,如果他们在正常的用户名验证上失败,我们也可以允许他们通过邮箱和密码登录(虽然下面的例子没有展示这个)。

在 settings.py 文件中:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'userprofile.my_authenticate.MyLoginBackend', # if they fail the normal test
 )

在 userprofile/my_authenticate.py 文件中:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class MyLoginBackend(ModelBackend):
    """Return User record if username + (some test) is valid.
       Return None if no match.
    """

    def authenticate(self, username=None, password=None, request=None):
        try:
            user = User.objects.get(username=username)
            # plus any other test of User/UserProfile, etc.
            return user # indicates success
        except User.DoesNotExist:
            return None
    # authenticate
# class MyLoginBackend
3

有用户无法登录?那就给他们一个完全随机的密码吧。

import random
user.set_password( str(random.random()) )

这样他们就永远无法登录了。

8

一个用户资料(通过django.contrib.auth.models.User.get_profile获取)并没有扩展用户表。你在AUTH_PROFILE_MODULE设置中指定的资料模型,其实只是一个模型,它里面有一个指向UserForeignKeyget_profile和这个设置其实只是为了方便你访问一个特定模型的实例,而这个模型又有一个指向特定User实例的ForeignKey

因此,一个选择是创建一个资料模型,其中指向UserForeignKey可以是null,这样你就可以把你的Photo模型和这个资料模型关联,而不是直接和User模型关联。这样的话,你就可以为一个不存在的用户创建一个资料,并在之后把一个注册的用户关联到这个资料上。

撰写回答