Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在用户注册结束时填充模型_Python_Django - Fatal编程技术网

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)
,我将使用它来获取用户的附加信息,例如:地址、电话等

我想在用户注册结束时在两个模型之间创建一个关系

在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插入外键字段

确定您可以拥有用户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