Python 如何在用户注册结束时填充模型
我有用于注册新用户的模型Python 如何在用户注册结束时填充模型,python,django,Python,Django,我有用于注册新用户的模型AuthCustomUser(AbstractUser)。它将保存登录所需的数据,例如:姓名、电子邮件和密码 另一方面,我有一个模型元用户(models.model),我将使用它来获取用户的附加信息,例如:地址、电话等 我想在用户注册结束时在两个模型之间创建一个关系 在modelMetaUser(models.model)中,我有一个外键: user = models.ForeignKey (settings.AUTH_USER_MODEL, on_delete = mo
AuthCustomUser(AbstractUser)
。它将保存登录所需的数据,例如:姓名、电子邮件和密码
另一方面,我有一个模型元用户(models.model)
,我将使用它来获取用户的附加信息,例如:地址、电话等
我想在用户注册结束时在两个模型之间创建一个关系
在modelMetaUser(models.model)
中,我有一个外键:
user = models.ForeignKey (settings.AUTH_USER_MODEL, on_delete = models.CASCADE)
当用户注册后,数据将输入模型AuthCustomUser(AbstractUser)
,然后我想在模型MetaUser(models.model)
中插入用户的“ID”,以建立两个模型之间的外键关系。最后,用户将在完成注册后立即启动会话,并可以访问home.html
这些是我的模型:
class MetaUser(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
screen_orientation = models.CharField(default='landscape', max_length=9)
def __str__(self):
return self.name
class AuthCustomUser(AbstractUser):
def __str__(self):
return self.name
以下是我对注册表的看法:
class SignUp(generic.CreateView):
form_class = CustomUserCreationForm
success_url = reverse_lazy('login')
template_name = 'signup.html'
def form_valid(self, form):
form.save()
username = self.request.POST['username']
password = self.request.POST['password1']
user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'],)
login(self.request, user)
if self.request.user.is_authenticated:
metaUser = MetaUser(user=self.request.user.id)
metaUser.save()
else:
return render(self.request, 'home.html', {})
我无法在注册时将ID插入外键字段 确定您可以拥有用户id。您可以这样做:
def form_valid(self, form):
form.save()
user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'],)
login(self.request, user)
metaUser = MetaUser(user=user, screen_orientation='some value')
metaUser.save()
return render(self.request, 'home.html', {})
此外,您需要确保新创建的用户是否处于活动状态,否则authenticate将不会返回user对象。要确保用户处于活动状态,可以在ModelManager中重写create\u User
方法。例如:
from django.contrib.auth.models import UserManager
class CustomUserManager(UserManager):
def _create_user(self, username, email, password, **extra_fields):
"""
Create and save a user with the given username, email, and password.
"""
if not username:
raise ValueError('The given username must be set')
email = self.normalize_email(email)
username = self.model.normalize_username(username)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.is_active=True
user.save(using=self._db)
return user
class AuthCustomUser(AbstractUser):
objects = CustomUserManager()
def __str__(self):
return self.name
def home(request):
return render(self.request, 'home.html', {})
# url
path('home/', home, name="home")
# usage in SignUp view
def form_valid(self, form):
...
return redirect('home') # instead of render(self.request, 'home.html', {})
另外,最好使用不同的视图来呈现主页。例如:
from django.contrib.auth.models import UserManager
class CustomUserManager(UserManager):
def _create_user(self, username, email, password, **extra_fields):
"""
Create and save a user with the given username, email, and password.
"""
if not username:
raise ValueError('The given username must be set')
email = self.normalize_email(email)
username = self.model.normalize_username(username)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.is_active=True
user.save(using=self._db)
return user
class AuthCustomUser(AbstractUser):
objects = CustomUserManager()
def __str__(self):
return self.name
def home(request):
return render(self.request, 'home.html', {})
# url
path('home/', home, name="home")
# usage in SignUp view
def form_valid(self, form):
...
return redirect('home') # instead of render(self.request, 'home.html', {})
当然,您可以拥有用户id。您可以这样做:
def form_valid(self, form):
form.save()
user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'],)
login(self.request, user)
metaUser = MetaUser(user=user, screen_orientation='some value')
metaUser.save()
return render(self.request, 'home.html', {})
此外,您需要确保新创建的用户是否处于活动状态,否则authenticate将不会返回user对象。要确保用户处于活动状态,可以在ModelManager中重写create\u User
方法。例如:
from django.contrib.auth.models import UserManager
class CustomUserManager(UserManager):
def _create_user(self, username, email, password, **extra_fields):
"""
Create and save a user with the given username, email, and password.
"""
if not username:
raise ValueError('The given username must be set')
email = self.normalize_email(email)
username = self.model.normalize_username(username)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.is_active=True
user.save(using=self._db)
return user
class AuthCustomUser(AbstractUser):
objects = CustomUserManager()
def __str__(self):
return self.name
def home(request):
return render(self.request, 'home.html', {})
# url
path('home/', home, name="home")
# usage in SignUp view
def form_valid(self, form):
...
return redirect('home') # instead of render(self.request, 'home.html', {})
另外,最好使用不同的视图来呈现主页。例如:
from django.contrib.auth.models import UserManager
class CustomUserManager(UserManager):
def _create_user(self, username, email, password, **extra_fields):
"""
Create and save a user with the given username, email, and password.
"""
if not username:
raise ValueError('The given username must be set')
email = self.normalize_email(email)
username = self.model.normalize_username(username)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.is_active=True
user.save(using=self._db)
return user
class AuthCustomUser(AbstractUser):
objects = CustomUserManager()
def __str__(self):
return self.name
def home(request):
return render(self.request, 'home.html', {})
# url
path('home/', home, name="home")
# usage in SignUp view
def form_valid(self, form):
...
return redirect('home') # instead of render(self.request, 'home.html', {})
你为什么要在这里使用身份验证?不进行身份验证,只需创建
AuthCustomUser
模型并将其添加到MetaUser
。为什么要在此处使用身份验证?不进行身份验证,只需创建AuthCustomUser
模型并将其添加到MetaUser
。