Django外键表单.save()问题
我是Django新手,尝试使用一个表单创建注册视图,该表单的模型扩展名为用户模型,来自Django外键表单.save()问题,django,Django,我是Django新手,尝试使用一个表单创建注册视图,该表单的模型扩展名为用户模型,来自Django.contrib.auth.models,UserCreations表单如下,但在服务器中提交注册表单后出现数据库错误: ORA-01400: cannot insert NULL into (The foreign key) 我以为钥匙会自动生成的。有什么问题吗?非常感谢你的帮助!! 意见如下: from django.contrib.auth.forms import UserCreati
Django.contrib.auth.models
,UserCreations表单如下,但在服务器中提交注册表单后出现数据库错误:
ORA-01400: cannot insert NULL into (The foreign key)
我以为钥匙会自动生成的。有什么问题吗?非常感谢你的帮助!!
意见如下:
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.http import HttpResponse
from django.shortcuts import render,redirect
from django.contrib.auth import authenticate, login, logout
from .forms import signupform
def signup_view(request):
if request.method =='POST':
form = UserCreationForm(request.POST)
s_form= signupform(request.POST)
if form.is_valid()and s_form.is_valid():
user =form.save()
s_form.save()
login(request,user)
return redirect("../")
else:
form =UserCreationForm()
s_form = signupform()
return render(request,'signup.html',{'form':form,'s_form': s_form})
这是表格
from django import forms
from django.contrib.auth.models import User
from .models import Profile
class signupform(forms.ModelForm):
error_messages = {
'password_mismatch': ("The two password fields didn't match."),
}
F_name = forms.CharField(label=("First Name"))
L_name = forms.CharField(label=("Last Name"))
Date_of_birth = forms.DateField()
email = forms.EmailField(widget=forms.TextInput(
attrs={'type': 'email',
'placeholder': ('E-mail address')}))
phone = forms.CharField()
class Meta:
model = Profile
fields = ("F_name", "L_name", "Date_of_birth", "email")
def save(self, commit=True):
user = super(signupform, self).save(commit=False)
if commit:
user.save()
return user
以下是模型:
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from django import forms
from django.core.exceptions import ObjectDoesNotExist
from django.conf import settings
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
Date_of_birth = models.DateField(null=True, blank=True)
F_name =models.CharField(max_length=50 )
L_name =models.CharField(max_length=50 )
email=models.EmailField(null=True, blank=True)
phone=models.CharField(max_length=8 )
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
try:
instance.profile.save()
except ObjectDoesNotExist:
Profile.objects.create(user=instance)
问题在于
s_表单中的Profile
仍然没有引用用户
对象。尽管使用信号创建了一个,但这不会更新s_表单中的Proile
,因为这是一个不同的Python对象
我建议在Profile
模型中删除信号,特别是因为信号被过度使用,而且很多Django ORM调用(尤其是批量调用)都绕过了信号。例如,见
然后,您可以将用户链接到视图中的配置文件:
from .forms import signupform
def signup_view(request):
if request.method =='POST':
form = UserCreationForm(request.POST)
s_form= signupform(request.POST)
if form.is_valid()and s_form.is_valid():
user =form.save()
s_form.instance.user = user
s_form.save()
login(request,user)
问题在于s_表单中的Profile
仍然没有引用用户
对象。尽管使用信号创建了一个,但这不会更新s_表单中的Proile
,因为这是一个不同的Python对象
我建议在Profile
模型中删除信号,特别是因为信号被过度使用,而且很多Django ORM调用(尤其是批量调用)都绕过了信号。例如,见
然后,您可以将用户链接到视图中的配置文件:
from .forms import signupform
def signup_view(request):
if request.method =='POST':
form = UserCreationForm(request.POST)
s_form= signupform(request.POST)
if form.is_valid()and s_form.is_valid():
user =form.save()
s_form.instance.user = user
s_form.save()
login(request,user)
非常感谢,它解决了问题:)非常感谢,它解决了问题:)