Python 在Django中为自定义模型创建登录

Python 在Django中为自定义模型创建登录,python,django,django-models,django-forms,django-authentication,Python,Django,Django Models,Django Forms,Django Authentication,Django中有很多实现用户身份验证的方法。我使用模型表单创建表单和注册流程。现在我真的不知道是否要登录。我不能使用内置登录,因为我的模型(称为Account)和django的内置用户模型之间没有关系。我想得到一些关于这条路的建议。这是我的密码: views.py: def sign_up(request): context = {} form = SignUpForm(request.POST or None, request.FILES or None) if fo

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)
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
lass SignUpForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(SignUpForm, self).__init__(*args, **kwargs)
models.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)
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
lass SignUpForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = "__all__"

    def __init__(self, *args, **kwargs):
        super(SignUpForm, self).__init__(*args, **kwargs)
forms.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)
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
lass SignUpForm(forms.ModelForm):
    class Meta:
        model = Account
        fields = "__all__"

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

示例如何创建自定义
帐户

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']
设置.py

AUTH_USER_MODEL = 'yourapp.Account'

扩展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)
使用您的逻辑注册视图:

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)

现在它说
AttributeError:type对象“Account”没有属性“USERNAME\u FIELD”
并且不允许我进行迁移或运行服务器:(朋友,你好,祝你一天愉快。你能检查一下我的这个问题吗?过去几天我的问题涉及的人很少,而且无法标记某人。请帮帮我。非常感谢。我唯一不明白的是,我是否应该完全删除我的帐户模型,并像你说的那样只留下一个用户模型?是的。你不需要额外的请求我很抱歉,伙计,
django.db.utils.OperationalError:没有这样的表:auth_user
意味着什么?可能忘记了迁移?检查数据库表
django_迁移
。这是所有迁移,你要应用的。这里也有新用户模型的迁移吗?