3

我有两个模型

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

我想要做的是为供应商和客户启用登录。供应商的登录网址是“供应商/登录”,客户是“客户/登录”。当供应商提交他的凭据时,我想检查用户是否是是否是供应商并引发验证错误。我找不到使用 django 完成此操作的方法。我基本上需要的是类似于用户的模型表单,它使用查询集检查用户是供应商。但 django auth 没有没有这样的东西。

4

2 回答 2

2

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

AUTHENTICATION_BACKENDS 是提供授权后端元组的设置常量。 您可以在此处查看有关身份验证后端的文档。

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

于 2013-07-10T14:31:01.293 回答
2

您可以使用Django 自定义用户模型,添加类型字段并将其用作工厂源来加载供应商/客户对象。这样的解决方案对我很有效。可以从以下几点开始:

模型.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())

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

于 2013-07-10T14:10:07.800 回答