使用modelform进行Django身份验证

时间:2013-07-10 14:01:32

标签: python django django-authentication

我有两个型号

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')
    ........................................................
    .......................................................

我想要做的是为供应商和客户启用登录。供应商的登录网址是“vendor / login”,客户是“customer / login”。虽然供应商提交了他的凭据,我想检查是否用户是否是供应商并提出验证错误。我找不到使用django完成此操作的方法。我基本上需要的是像用户的模型形式,它检查用户是使用queryset的供应商。但是django auth没有这样的东西。

2 个答案:

答案 0 :(得分:2)

您可以使用Django custom user model,添加类型字段并将其用作工厂源来加载供应商/客户对象。这样的解决方案对我很有用。从...开始:

<强> models.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())

您只需添加新类并实现所需的方法即可轻松创建其他用户类型,而无需触及其余代码。

答案 1 :(得分:2)

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

AUTHENTICATION_BACKENDS是给定授权后端元组的设置常量。 here可以查看有关身份验证后端的文档。

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