Django запрос расширенной модели пользователя для аутентификации - PullRequest
0 голосов
/ 04 апреля 2020

У меня проблема с аутентификацией в 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)

Я расширил пользовательскую модель по умолчанию django на одно поле в моей модели Meas_User.

Теперь я попытался написать логин просмотр для пользователей моего приложения. Но я не понимаю, как выполнить запрос, подобный следующему 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 (), но безуспешно. Мой желаемый результат состоит в том, чтобы пользователь мандата - идентифицированный введенным номером клиента - (если применимо) проверил введенный пароль на следующем шаге.

1 Ответ

1 голос
/ 04 апреля 2020

Возможно, что-то вроде этого будет работать:

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). Может быть проще иметь две модели. У меня есть хороший опыт работы с пользовательской моделью, расширяющей класс AbstractUser с Django. См. https://docs.djangoproject.com/en/3.0/topics/auth/customizing/#using -a-custom-user-model-when-a-project .

...