Python 用户注册完全不在Django中工作
我正在构建一个带有注册表单的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
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只需检查缩进即可。不要只是复制粘贴代码段。您是否在其中输入了任何错误?它不应该提出问题。