Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
Django外键表单.save()问题_Django - Fatal编程技术网

Django外键表单.save()问题

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新手,尝试使用一个表单创建注册视图,该表单的模型扩展名为用户模型,来自
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)

非常感谢,它解决了问题:)非常感谢,它解决了问题:)