Django Вход / Регистрация У собственных пользователей Модель - PullRequest
0 голосов
/ 16 октября 2018

Я использую phpMyAdmin для базы данных.Я создаю собственную таблицу пользователей и храню в ней информацию о пользователях, не расширяя пользовательскую модель Django.Теперь у меня есть проблема в части входа в систему.Я не могу получить данные из таблицы пользователей с объектами, и функция проверки подлинности также не работает.Вот мой код:

View.py

from django.shortcuts import render,redirect
from django.http import HttpResponse
from .form import SignUp,UserLogin
from .models import users
from django.contrib.auth import authenticate,get_user_model,login,logout
from django.contrib.auth.models import User
def Userlogin(request):
   form=UserLogin()
   if request.method == 'POST':
      user_login = UserLogin(request.POST or None)
    if user_login.is_valid():
        username = request.POST.get('email', '')
        password = request.POST.get('password', '')
        getInfo=users.objects.get(email='example@mail.com')
        user=authenticate(email=username,password=password)
        if user is not None and user.is_active:
           login(request,user)
           return redirect('/')
args={'form':form}
return render(request,'html/login.html',args)

form.py

from django import forms
from .models import users
class UserLogin(forms.Form):
     email = forms.CharField(widget=forms.EmailInput(attrs=
                {   'value':'', 
                    'class':'form-control'}))
     password = forms.CharField(widget=forms.TextInput(attrs=
                {   'type': '', 
                    'value':"mukul", 
                    'class':'form-control'}))

model.py

from django.db import models
class users(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=100, blank=False)
    email=models.EmailField(max_length=100, blank=False, unique=True)
    password=models.CharField(max_length=500, blank=False)
    created_at=models.DateField(auto_now_add=True)
    updated_at=models.DateField(auto_now_add=True)

    def __str__(self):
        return self.email

Что мне нужно: -

  1. Выполнить authenticate().это не работает, я не знаю, что хотеть не так.Если я хочу создать новый authenticate() в forms.py.
  2. , если я вызову users.objects.get(email='example@mail.com'), это также не работает в view.py, но при запуске в оболочке Python он работает очень хорошо.

    getInfo = users.objects.get(email='example@mail.com')
    

показать ошибку:

у пользователей класса нет объектов member

У меня есть вопрос

если я создаю модель собственного пользователя

  1. Хочу ли я создать собственную функцию аутентификации для входа в систему?
  2. Хочу ли я создать objects.get(),objects.all(), objects.create_user() и т. Д.

Помогите мне, я работаю над проектом и застрял на этой ошибке. Спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Ответ на ваши вопросы. Сначала: если я создаю модель для собственных пользователей: хочу ли я создать собственную функцию аутентификации для входа в систему?Да Хочу ли я создать objects.get (), objects.all (), objects.create_user () и т. Д.?Нет

Вам нужно исправить ошибки:

views.py

from django.shortcuts import render,redirect
from django.http import HttpResponse
from .forms import SignUp,UserLogin #Wrong Import
from .models import users
from django.contrib.auth import authenticate,get_user_model,login,logout
from django.contrib.auth.models import User
def Userlogin(request):
   form=UserLogin()
   if request.method == 'POST':
    user_login = UserLogin(request.POST or None)   #Indentation
    if user_login.is_valid():
        username = request.POST.get('email', '')
        password = request.POST.get('password', '')
        getInfo=users.objects.get(email='example@mail.com')
        user=authenticate(email=username,password=password)
        if user is not None and user.is_active:
           login(request,user)
           return redirect('/')
   args={'form':form} #Fix Indentation
   return render(request,'html/login.html',args) #Fix Indentation

Models.py

class users(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=100, blank=False)
    email=models.EmailField(max_length=100, blank=False, unique=True)
    password=models.CharField(max_length=500, blank=False)
    created_at=models.DateField(auto_now_add=True)
    updated_at=models.DateField(auto_now_add=True)

    def __str__(self):
        return self.email

Кроме того, что вам нужно сделать, этоЗапустите Миграции.python manage.py makemigrations appname python manage.py migrate

Это автоматически создаст модель в базе данных, и, следовательно, ORM Django будет работать для .objects.get

=========== Обновить =========

Изменить Models.py (расширить пользователей по умолчанию, так как оно уже содержит поля электронной почты и пароля)

from django.db import models
from django.contrib.auth.models import User as AuthUser, UserManager

# Extend the base User model
class User(AuthUser):
    class Meta:
        db_table = 'user'

    active = models.CharField(max_length=1)
    last_modified = models.DateTimeField("last modified")

    objects = UserManager()

ПереопределитьDjango Model Backend для пользователя

class CustomAuth(ModelBackend):
    def authenticate(**credentials):
        return super(CustomAuth, self).authenticate(**credentials)

    def authenticate(self, username=None, password=None):    
        # Check the username/password and return a User.
        if username != None and password != None:
            # Get the user
            try:
                user = User.objects.get(email=username)
                if user.check_password(password):
                    logger.info('User is authenticated, logging user in')
                    return user
            except User.DoesNotExist:
                pass
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(id=user_id)
        except User.DoesNotExist:
           return None

теперь вы можете использовать его как:

user = authenticate(username='test@gmail.com', password='testUser')

для дальнейшего использования: https://www.micahcarrick.com/django-email-authentication.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...