我有用于注册新用户的模型AuthCustomUser(AbstractUser)
。其中将保存用于登录的必要数据,例如:名称,电子邮件和密码。
另一方面,我拥有模型MetaUser (models.Model)
,该模型将用于用户的其他信息,例如:地址,电话,等
我想在用户注册结束时在两个模型之间创建一种关系。
在模型MetaUser(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插入到外键字段中。
答案 0 :(得分:0)
确定您可以拥有用户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将不会返回该用户对象。为确保用户处于活动状态,可以在ModelManager中覆盖create_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', {})