Python 使用modelform的Django身份验证

Python 使用modelform的Django身份验证,python,django,django-authentication,Python,Django,Django Authentication,我有两种型号 from django.contrib.auth.models import User class Vendor(models.MOdel): user = models.ForeignKey(User,related_name = 'vendor') ...................................................... .................................................

我有两种型号

from django.contrib.auth.models import User
class Vendor(models.MOdel):
    user = models.ForeignKey(User,related_name = 'vendor')
    ......................................................
    ......................................................
class Customer(models.MOdel):
    user = models.ForeignKey(User,related_name = 'customer')
    ........................................................
    .......................................................
我要做的是为供应商和客户启用登录。供应商的登录url为“供应商/登录”,客户为“客户/登录”。当供应商提交其凭据时,我想检查用户是否是供应商,并引发验证错误。我找不到使用django实现这一点的方法。我基本上需要的是类似于用户的modelform的东西,它使用queryset检查用户是否是供应商。但django auth没有类似的东西。

您可以使用,添加类型字段并将其用作工厂源以加载供应商/客户对象。这种解决办法对我很有效。从以下几点开始:

型号.py

from django.contrib.auth.models import AbstractUser

TYPES = (
    ('Vendor', 'Vendor'),
    ('Customer', 'Customer'),
)


class MyUser(AbstractUser):
    type = models.CharField(max_length=10, choices=TYPES, default='Customer') 
如果将来需要添加其他类型,这种方法非常灵活,并且可以很好地扩展。重定向方法的小示例:

class Base():
    def __init__(self, auth_user):
        self.user = auth_user

    def redirect_to(self):
        return ""

class Vendor(Base):
    def redirect_to(self):
        return "/login/vendor"

class Customer(Base):
    def redirect_to(self):
        return "/login/customer"
然后在
login
视图中,您只需动态创建用户对象:

auth_user = form.get_user()
cls = globals()[auth_user.type]
user = cls(auth_user)  # This will return either Vendor or Customer object
return HttpResponseRedirect(user.redirect_to())

只需添加新类并实现所需的方法,就可以轻松创建另一个用户类型,而无需涉及代码的其余部分。

对我来说,最好的策略是编写两个身份验证后端,一个支持供应商身份验证,另一个支持客户身份验证

AUTHENTICATION\u BACKENDS是提供授权后端元组的设置常量。 你能检查一下关于认证后端的文档吗


使用settings参数声明您的实现。订单计数django将尝试所有后端,直到其中一个成功。

感谢您的快速响应。但是,我如何使用django身份验证登录?我如何找到是否是试图登录的客户?您通过用户名/密码正确选择用户?一旦从数据库中获取了用户,就可以检查类型并根据用户类型随时重定向。你可能需要为此编写你自己的
登录
视图,这应该很简单-只需更改重定向部分。哇,这看起来像我需要的东西。需要先了解一下。嗨,我编写了自定义身份验证后端。但是身份验证后端的执行方式(订单计数django将尝试所有后端,直到其中一个成功)是这里的问题。我需要执行任意一个后端,而不是全部。(我为客户创建了一个后端,为供应商创建了一个后端)。如果客户尝试登录供应商登录,他将获得身份验证,因为两个后端都运行。确切地说,当我在url“vendor/login”上时,我只想运行供应商身份验证后端。有多种解决方案,我可以给你一些有关它们的提示(尽管它们可能有点黑客)但对我来说,主要的问题在于您的模型,因为只有使用模型(而不是url或另一个get或post参数)才能区分这两种类型的用户。如果是这样,那么第一个后端(比如供应商认证后端)将尝试在具有供应商属性的筛选查询集中对用户进行身份验证(例如),是的,我这样做了。但问题是我有两个后端身份验证(backends.VendorLoginBackend=('backends.VendorLoginBackend','django.contrib.auth.backends.modelbend'))。如果客户尝试登录供应商页面,他将使用第二个后端进行身份验证。我要执行的操作是仅在尝试对供应商进行身份验证时运行“backends.VendorLoginBackend”。