Создание входа для пользовательской модели в Django - PullRequest
0 голосов
/ 10 марта 2020

Существует множество способов реализовать аутентификацию пользователя в Django. И я использовал модель формы, чтобы создать форму и зарегистрироваться. Теперь я действительно не имею представления о входе в систему. Я не могу использовать встроенный вход в систему, потому что нет никакой связи между моей моделью (она называется Account) и встроенной моделью пользователя django. Я хочу получить совет о пути. Вот мои коды:

views.py:

def sign_up(request):
    context = {}
    form = SignUpForm(request.POST or None, request.FILES or None)

    if form.is_valid():
        form.save()
        return redirect('/')
    else:
        form = SignUpForm(request.POST or None, request.FILES or None)
    context['form'] = form
    return render(request, "sign_up.html", context)

models.py:

class Account(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField(max_length=60)
    username = models.CharField(max_length=30)
    password = models.CharField(max_length=60)
    university_name = models.ForeignKey(
        University, on_delete=models.CASCADE, blank=True, null=True)
    isPhysicalAccount = models.BooleanField(default=False)

    def __str__(self):
        return self.username

forms.py:

lass SignUpForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(SignUpForm, self).__init__(*args, **kwargs)

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Продлить django модель пользователя:

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    university_name = models.ForeignKey(
        University, on_delete=models.CASCADE, blank=True, null=True)
    isPhysicalAccount = models.BooleanField(default=False)

    class Meta:
        db_table = 'auth_user'
        ordering = ('id', 'username', 'first_name', 'last_name')

settings.py:

    AUTH_USER_MODEL = 'appname.User'

, чтобы получить пользователя с этой моделью:

from django.contrib.auth import get_user_model

user_model = get_user_model()
user_model.objects.get(id=1)

зарегистрироваться просмотр с вашей логикой c:

from django.contrib.auth.forms import AuthenticationForm

def sign_up(request):
    context = {}
    form = AuthenticationForm(request.POST or None, request.FILES or None)

    if form.is_valid():
        form.save()
        return redirect('/')
    else:
        form = AuthenticationForm(request.POST or None, request.FILES or None)
    context['form'] = form
    return render(request, "sign_up.html", context)
0 голосов
/ 11 марта 2020

Пример, как сделать свой собственный Account

from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import ( PermissionsMixin, 
  _user_has_module_perms, _user_has_perm )

class Account(AbstractBaseUser, PermissionsMixin):
 first_name = models.CharField(max_length=30)
 last_name = models.CharField(max_length=30)
 email = models.EmailField(max_length=60)
 username = models.CharField(max_length=30)
 password = models.CharField(max_length=60)
 university_name = models.ForeignKey(
    University, on_delete=models.CASCADE, blank=True, null=True)
 isPhysicalAccount = models.BooleanField(default=False)
 is_admin = models.BooleanField(default=False)
 is_active = models.BooleanField(default=True)
 is_staff = models.BooleanField(default=False)

 def __str__(self):
  return self.username

 def has_perm(self, perm, obj=None):
    if self.is_active and self.is_superuser:
        return True
    return _user_has_perm(self, perm, obj)

 def has_perms(self, perm_list, obj=None):
    return all(self.has_perm(perm, obj) for perm in perm_list)

 def has_module_perms(self, app_label):
    if self.is_active and self.is_superuser:
        return True
    return _user_has_module_perms(self, app_label)


USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['username']

settings.py

AUTH_USER_MODEL = 'yourapp.Account'
...