【问题标题】:Django query extended user model for authenticationDjango 查询扩展用户模型进行身份验证
【发布时间】:2020-07-16 10:33:25
【问题描述】:

我在 django 中使用扩展用户模型进行身份验证时遇到问题。 我希望用户使用客户编号、用户名和密码进行身份验证。

这是我的模型:

class Mandant(models.Model):
    Mandant_id = models.AutoField('ID', primary_key= True)
    Mandant_accn= models.CharField('Kundennummer', max_length=10)
    Mandant_name = models.CharField('Bezeichnung', max_length=200)
    Mandant_street = models.CharField('Straße', max_length=200, null=True, blank=True)
    Mandant_zip = models.CharField('PLZ', max_length=10, null=True, blank=True)
    Mandant_city = models.CharField('Ort', max_length=200, null=True, blank=True)
    Mandant_iban = models.CharField('IBAN', max_length=200, null=True, blank=True)
    Mandant_bic = models.CharField('BIC', max_length=200, null=True, blank=True)
    Mandant_ustid = models.CharField('UstID', max_length=200, null=True, blank=True)
    Mandant_vf = models.DateTimeField('Gültig von', default=now)
    Mandant_vu = models.DateTimeField('Gültig bis', null=True, blank=True)
    Mandant_ia = models.DateTimeField('Hinzugefügt am', auto_now=True)
    Mandant_deleted = models.BooleanField('Gelöscht', default=False)

    def __str__(self):
        return self.Mandant_name

    class Meta:
        app_label ="meas"
        ordering = ['Mandant_ia']

class Meas_User(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    mandant_id = models.ForeignKey(Mandant, on_delete=models.CASCADE)

我在 Meas_User 模型中使用 onetoonefield 扩展了 django 默认用户模型。

现在我尝试为我的应用用户编写登录视图。 但我不知道如何在下面的 SQL 语句中进行查询

SELECT User, Mandant FROM [User] INNER JOIN (Mandant INNER JOIN MEAS_user ON Mandant.Mandant_ID = MEAS_user.Mandant_ID) ON User.ID = MEAS_user.user_ID WHERE (((User.username)="lorem Ipsum") AND ((Mandant.Customer_Number)="1234"));

我尝试了 select_related() 函数,但没有成功。 我想要的结果是让授权的用户(由输入的客户编号识别)(如果适用)在下一步检查输入的密码。

【问题讨论】:

    标签: python sql django django-models django-views


    【解决方案1】:

    可能这样的事情会起作用:

    from django.contrib.auth.models import User
    from .models import Mandant, Meas_User
    from django.contrib.auth import authenticate, login
    
    def loginview(request):
        if request.method == 'POST':
            mandant_accn = request.POST['mandant_accn']
            password =  request.POST['password']
            mandant = Mandant.objects.get(mandant_accn=mandant_accn)
            meas_user = Meas_User.objects.get(meas_user=mandant.Mandant_id)
            username = User.objects.get(pk=meas_user.user_id).username
            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
    

    还没有完全测试,但是你在模板中要求账号,发送到视图,找到对应的Mandant,从那里找到对应的用户,然后使用标准登录。

    您的设置有点复杂,用户信息分布在三个模型(标准 Django 用户模型、Meas_User、Mandant)上。只有两个模型可能更简单。我对自定义用户模型有很好的经验,从 Django 扩展 AbstractUser 类。见https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 2022-09-29
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2012-01-26
      • 2018-03-03
      相关资源
      最近更新 更多