所以我尝试在 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的默认身份验证。
认证后端负责处理认证请求并返回相应的用户模型。它还提供对用户权限的访问。
它可能是这样的:
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
]
需要记住的一些注意事项:
make_password
函数来计算哈希值。Agent.password
字段扩展至最多 128 个字符,否则不足以存储哈希密码值。进一步阅读: