如何在 Django 中创建单独的用户群而不扩展用户模型

问题描述 投票:0回答:1

所以我尝试在 Django 中构建一个网站,我想要两个独立的用户群,例如

users
agents
agent
可以是代理人,但不是
user
Agents
有一个单独的登录 URL,并且
users
有一个单独的登录 URL。这就是我被困住的地方。我似乎无法为
agents
创建不同的登录页面。任何人都可以在不登录/注册为用户的情况下申请成为代理,如果他/她符合要求,他/她将在管理面板中通过
superuser
注册为代理。有没有更好的方法来做到这一点?

我的模型.py:

from django.contrib.auth.models import User

class Agent(models.Model):
    name = models.CharField(max_length=100)
    password = models.CharField(max_length=100)
    image = models.ImageField(upload_to = 'Images/')
    bio = models.TextField()
    instagram = models.URLField(max_length=100)
    twitter = models.URLField(max_length=100)
    facebook = models.URLField(max_length=100)
    linkedin = models.URLField(max_length=100)
    is_featured = models.BooleanField(default = False)
    slug = models.SlugField(default='')

    def __str__(self):
        return f'{self.name} Agent Profile'

我的forms.py:

class AgentSignInForm(AuthenticationForm):
    username = forms.CharField(max_length=100)
    password = forms.CharField(max_length=100)
    def clean(self):
        cleaned_data = super().clean()
        username = cleaned_data.get('username')
        password = cleaned_data.get('password')
        return cleaned_data

我的模型.py:

class AgentLoginView(LoginView):
    form_class = AgentSignInForm
    def form_valid(self, form):
        form.send_email()
        return super().form_valid(form)

我的网址.py:

urlpatterns = [
path('agent-sign-in/', auth_views.LoginView.as_view(template_name='users/agent_login.html'), name='agent-sign-in'),
]
django django-models django-views django-forms
1个回答
0
投票

为了实现你想要的行为,你必须自定义Django的默认身份验证。

实现自定义后端

认证后端负责处理认证请求并返回相应的用户模型。它还提供对用户权限的访问。

它可能是这样的:

from contextlib import suppress

from django.contrib.auth.backends import BaseBackend
from django.contrib.auth.hashers import check_password


class AgentBackend(BaseBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # Skip authentication attempts without credentials
        if username is None or password is None:
            return

        # Get agent by name, check the password hash and return it if everything is ok
        with suppress(Agent.DoesNotExist):  
            agent = Agent.objects.get(name=username)
            if check_password(password, agent.password):
                return agent
        return None

    def get_user(self, user_id):
        # Fetch and return agent if it exists
        with suppress(Agent.DoesNotExist):
            return Agent.objects.get(pk=user_id)
        return None

在设置中启用新后端

在 Django 设置中,您需要启用新的后端以及默认后端。

AUTHENTICATION_BACKENDS = [
    "django.contrib.auth.backends.ModelBackend",
    "path.to.your.backend.AgentBackend",  # <-- Note: this need to be updated to your actual Backend module
]

需要记住的一些注意事项:

  1. 上面的后端实现经过简化,不包含权限。如果您需要这些功能,您需要扩展它。
  2. 确保不要为模型分配明文密码。使用
    make_password
    函数来计算哈希值。
  3. 您可能需要将
    Agent.password
    字段扩展至最多 128 个字符,否则不足以存储哈希密码值。

进一步阅读:

© www.soinside.com 2019 - 2024. All rights reserved.