Python 在Django中为自定义模型创建登录
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
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_迁移
。这是所有迁移,你要应用的。这里也有新用户模型的迁移吗?