Python 用户注册完全不在Django中工作

Python 用户注册完全不在Django中工作,python,django,Python,Django,我正在构建一个带有注册表单的Django应用程序。为此,我向模型中添加了其他字段,如下所示: models.py class studentInfo(models.Model): user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student") student_id = models.IntegerField(primary_key=Tr

我正在构建一个带有注册表单的Django应用程序。为此,我向模型中添加了其他字段,如下所示:

models.py

class studentInfo(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student")
    student_id = models.IntegerField(primary_key=True, null=False, validators=[MaxValueValidator(99999),
                    MinValueValidator(10000)])
    major = models.CharField(max_length=500,null=True, blank=False, default= '------')

class UserReg(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email')

class StudentReg(forms.ModelForm):
    class Meta:
        model = studentInfo
        fields = ('student_id', 'phone', 'major', 'eof', 'arc')

@receiver(post_save, sender=User)
def create_student(sender, instance, created, **kwargs):

    
    if created:
        studentInfo.objects.create(user=instance)
和我的
forms.py

class studentInfo(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student")
    student_id = models.IntegerField(primary_key=True, null=False, validators=[MaxValueValidator(99999),
                    MinValueValidator(10000)])
    major = models.CharField(max_length=500,null=True, blank=False, default= '------')

class UserReg(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email')

class StudentReg(forms.ModelForm):
    class Meta:
        model = studentInfo
        fields = ('student_id', 'phone', 'major', 'eof', 'arc')

@receiver(post_save, sender=User)
def create_student(sender, instance, created, **kwargs):

    
    if created:
        studentInfo.objects.create(user=instance)
这是我的
视图.py
(这肯定是不正确的,但我想添加它以显示我的尝试)

编辑:这是信号文件
signals.py

class studentInfo(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE, related_name="student")
    student_id = models.IntegerField(primary_key=True, null=False, validators=[MaxValueValidator(99999),
                    MinValueValidator(10000)])
    major = models.CharField(max_length=500,null=True, blank=False, default= '------')

class UserReg(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email')

class StudentReg(forms.ModelForm):
    class Meta:
        model = studentInfo
        fields = ('student_id', 'phone', 'major', 'eof', 'arc')

@receiver(post_save, sender=User)
def create_student(sender, instance, created, **kwargs):

    
    if created:
        studentInfo.objects.create(user=instance)
signup.html
——在此处呈现表单

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Signup Student</title>

    <body>
        <h1>Form goes here</h1>

        <form method = "POST" action="">
            {% csrf_token %}
            {{ userF.as_p }}
            {{ studF.as_p }}
            
            <input type="submit" value="save" />
        </form>

        
    </body>
</head>
<body>
    
</body>
</html>

注册学生
表格在这里
{%csrf_令牌%}
{{userF.as_p}}
{{studF.as_p}

我遇到的问题是Django正在创建一个用户,但它并没有创建一个学生。为了创建student对象,它需要创建一个已经存在的用户。点击提交按钮时,是否有方法验证两个表单并创建用户和学生?

您正在尝试连接未加载文件中的信号。非常简单的解决方案是删除
@receiver
装饰器,并使用
signals.py
作为函数模块。不过,您需要在apps.py中执行一些操作

class YourAppConfig(AppConfig):
name='name'
verbose_name='verbose'#常规内容
def就绪(自我):
#导入内部就绪,因为在此之前未加载应用程序
从django.contrib.auth.models导入用户
从django.db.models.signals导入后保存
从.signals导入创建\u学生
post\u save.connect(创建学生,发件人=用户)
您的
signals.py
应该如下所示:

def create_student(发送方、实例、已创建、**kwargs):
如果创建:
studentInfo.objects.create(用户=实例)

您正在尝试连接未加载的文件中的信号。非常简单的解决方案是删除
@receiver
装饰器,并使用
signals.py
作为函数模块。不过,您需要在apps.py中执行一些操作

class YourAppConfig(AppConfig):
name='name'
verbose_name='verbose'#常规内容
def就绪(自我):
#导入内部就绪,因为在此之前未加载应用程序
从django.contrib.auth.models导入用户
从django.db.models.signals导入后保存
从.signals导入创建\u学生
post\u save.connect(创建学生,发件人=用户)
您的
signals.py
应该如下所示:

def create_student(发送方、实例、已创建、**kwargs):
如果创建:
studentInfo.objects.create(用户=实例)

您不再需要信号。获取已保存用户的id,然后添加commit=false以在表单中追加用户id

def signup(request):
    print("in view")
    if request.POST:
        print("in post")
        userF = UserReg(request.POST)
        studF = StudentReg(request.POST)
        if userF.is_valid():
            userF.save()
            if studF.is_valid():
                student_f = studF.save(commit=False)
                studfF.user = userF.id      
                studF.save() 
                return redirect('login') 

你不再需要信号了。获取已保存用户的id,然后添加commit=false以在表单中追加用户id

def signup(request):
    print("in view")
    if request.POST:
        print("in post")
        userF = UserReg(request.POST)
        studF = StudentReg(request.POST)
        if userF.is_valid():
            userF.save()
            if studF.is_valid():
                student_f = studF.save(commit=False)
                studfF.user = userF.id      
                studF.save() 
                return redirect('login') 


运行此操作时,我收到一个csrf令牌错误。我是否必须在
apps.py
中导入某些内容?是否在模板的
中包含
{%csrf\u token%}
?或者如果您使用JS发送,是否附加
'X-CSRFToken'
标题?是的,我在表单模板中添加了我的csrf令牌。我也可以在问题中显示我的HTML文件,您如何发送请求?我没有看到表单中的submit btn。我只是在末尾添加了一个
。运行此操作时,我收到一个csrf令牌错误。我是否必须在
apps.py
中导入某些内容?是否在模板的
中包含
{%csrf\u token%}
?或者如果您使用JS发送,是否附加
'X-CSRFToken'
标题?是的,我在表单模板中添加了我的csrf令牌。我也可以在问题中显示我的HTML文件,您如何发送请求?我没有看到表单中的submit btn。我只是在末尾添加了一个
,我将它添加到
视图.py
为什么我会得到这样的结果:在分配前引用的/signup/local变量“userF”处未绑定本地错误imo最好通过信号添加扩展用户模型,以启用管理员用户创建等。信号的问题是你不能添加用户提供的数据。要做到这一点,您需要点击数据库2次,但只需点击一次即可。@abhivemp只需检查缩进即可。不要只是复制粘贴代码段。您是否在其中输入了任何错误?它不应该引起问题。我将此添加到
views.py
为什么会得到这样的结果:在分配前引用的/signup/local变量“userF”处出现UnboundLocalError。IMO最好通过信号添加扩展用户模型,以启用管理员用户创建等。信号的问题是您无法添加用户提供的数据。要做到这一点,您需要点击数据库2次,但只需点击一次即可。@abhivemp只需检查缩进即可。不要只是复制粘贴代码段。您是否在其中输入了任何错误?它不应该提出问题。