Django数据未提交到我的数据库,但没有错误

2024-09-27 00:14:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在制作一个跟踪不同电话公司所有者的系统,让用户添加所有者的姓名。我希望用户能够一次添加几个所有者,并且,为了避免大量的RegEx、Ajax和Node,我在数据库中创建了5个“所有者”表(我知道这是意大利面条代码的缩影)。最后4个所有者表具有null=True和blank=True,因此它们是可选的。在UI中显示时,我将所有者的每个表单字段表示放在自己的div中,并隐藏最后4个div。用户可以通过单击按钮选择“添加其他所有者”,最多可添加4个额外所有者。很少所有五个div都被填写,因此其中一些始终被基本javascript隐藏。然后,我继续使用.save()和其他模型一样保存它们。当用户填写完所有需要的字段并点击“提交”时,一切正常,但是。。。数据永远不会被发送到数据库

我在任何地方都没有错误,这导致我猜测在保存数据时传递的表单无效。我知道问题出在“几个隐藏的表单”部分,因为我的系统在只有一个所有者表而没有任何隐藏的情况下工作得很好。然而,由于它没有给我任何错误消息,我现在不知所措,我不知道为什么它认为我的表单无效

注意:我意识到django的方法是创建表单集来添加一个表的多个实例,但是在表单集中创建这些动态和隐藏,比如说,5个表单中的4个表单,并在单击按钮时显示其余的表单,或者使用循环实现真正的动态表单行为,这是非常具有挑战性的,我没有javascript/react知识来做到这一点。隐藏表单并在用户请求时显示表单的能力非常重要-我知道,如果不这样做,只需使用表单集而不隐藏任何内容,就可以轻松解决此问题

编辑: 我尝试了一些方法来修复它,例如在表单名称和.save()之间添加.instance,设置instance=(我正在编辑其实例的表单),然后设置commit=False,最后在保存时设置commit=True。我生成的新“实例”变量为灰色,没有显示“未使用局部变量“实例”值”的消息

我在models.py文件中发现一个错误:在PhoneCompany中,所有者集应该是一个外键,但实际上是作为一个ManyToManyField写入的。当我更正它时,它返回以下错误:django.db.utils.IntegrityYerror:非空约束失败:new_uPhoneBook\u companyinformation.owner\u集\u id 我想这并不奇怪;因为数据从未保存到数据库中,所以没有创建所有者集,因此也没有可引用的所有者集

my models.py文件:

from django.db import models


Owner1(models.Model):
    owner1_name = models.CharField(max_length=200)

Owner2(models.Model):
    owner2_name = models.CharField(max_length=200)

Owner3(models.Model):
    owner3_name = models.CharField(max_length=200)

Owner4(models.Model):
    owner4_name = models.CharField(max_length=200)

Owner5(models.Model):
    owner5_name = models.CharField(max_length=200)

OwnerSet(models.Model):
    owner1 = models.ForeignKey(Owner1, on_delete=models.CASCADE, default=None)
    owner2 = models.ForeignKey(Owner2, on_delete=models.CASCADE, default=None)
    owner3 = models.ForeignKey(Owner3, on_delete=models.CASCADE, default=None)
    owner4 = models.ForeignKey(Owner4, on_delete=models.CASCADE, default=None)
    owner5 = models.ForeignKey(Owner5, on_delete=models.CASCADE, default=None)

PhoneCompany(models.Model):
    name = models.CharField(max_length = 400, default=None)
    address = models.CharField(max_length = 400, default=None)
    owner_set = models.ForeignKey(OwnerSet, on_delete=models.CASCADE, default=None)

my forms.py文件:

from django.forms import ModelForm
from django import forms
from .models import *


class Form1(ModelForm):
    class Meta:
        model = Owner1
        fields = ['owner1_name']

        widgets = {
            'owner1_name': TextInput(attrs={'class': 'form-control', 'id': 'owner1'})}


class Form2(ModelForm):
    class Meta:
        model = Owner2
        fields = ['owner2_name']

        widgets = {
            'owner2_name': TextInput(attrs={'class': 'form-control', 'id': 'owner2'})}


class Form3(ModelForm):
    class Meta:
        model = Owner3
        fields = ['owner3_name']

        widgets = {
            'owner3_name': TextInput(attrs={'class': 'form-control', 'id': 'owner3'})}


class Form4(ModelForm):
    class Meta:
        model = Owner4
        fields = ['owner4_name']

        widgets = {
            'owner4_name': TextInput(attrs={'class': 'form-control', 'id': 'owner4'})}


class Form5(ModelForm):
    class Meta:
        model = Owner5
        fields = ['owner5_name']

        widgets = {
            'owner5_name': TextInput(attrs={'class': 'form-control', 'id': 'owner5'})}


class Form6(ModelForm):
    class Meta:
        model = OwnerSet
        fields = ['owner1_name']  
        # because i needed at least one to make the code run and it didn't like like '__all__'

        widgets = {
            'owner1_name': iTextInput(attrs={'class': 'form-control', 'id': 'fk_owner1'})}


class Form7(ModelForm):
    class Meta:
        model = PhoneCompany
        fields = ['name', 'address']

        widgets = {
            'name': TextInput(attrs={'class': 'form-control', 'id': 'comp_name'})
            'address': TextInput(attrs={'class': 'form-control', 'id': 'adrs'})
        }

my views.py文件:

from django.shortcuts import render, redirect
from .forms import *

def company_input(request):
    form1 = Form1()  
    form2 = Form2() 
    form3 = Form3()  
    form4 = Form4()  
    form5 = Form5()  
    form6 = Form6() 
    form7 = Form7()

    if request.method == 'POST':
        form_owner1 = Form1(request.POST)
        form_owner2 = Form2(request.POST)
        form_owner3 = Form3(request.POST)
        form_owner4 = Form4(request.POST)
        form_owner5 = Form5(request.POST)
        form_ownerset = Form6(request.POST)
        form_company = Form7(request.POST)

        if form_owner1.is_valid() and form_owner2.is_valid() and 
        form_owner3.is_valid() and form_owner4.is_valid() and 
        form_owner5.is_valid() and form_ownerset.is_valid() and 
        form_company.is_valid():
            owner1 = form_owner1.save()
            owner2 = form_owner2.save()
            owner3 = form_owner3.save()
            owner4 = form_owner4.save()
            owner5 = form_owner5.save()

            instance = form_ownerset.save(commit=False) # greys out
            instance.owner1 = owner1
            instance.owner2 = owner2
            instance.owner3 = owner3
            instance.owner4 = owner4
            instance.owner5 = owner5
            ownerset = instance.save(commit=True)

            instance = form_company.save(commit=False)  # greys out
            instance.ownerset = ownerset
            company = instance.save()
        else: 
            print("Error: a form is not valid.")  # never returns the error...

    context = {'from1': form1,
               'form2': form2,
               'form3': form3,
               'form4': form4,
               'form5': form5,
               'form6': form6,
               'form7': form7,
               }
    return render(request, 'phoneBook/reg_owners.html', context)

my reg_owners.html文件:

            <div id="owners" class="column">
                <div id="owner1">
                    <h5>Owner 1:</h5>
                    <br>
                    {{ form1.as_p }}
                </div>

                <div id="masterdiv">
                    <button id="btn1" style="width: 90px; margin-left: 40px" >Add Owner</button>
                    <div id="own2" style="display: none; margin-left: 40px; border-radius: 6px;">
                        <p>{{ form2.as_p }}</p>
                    </div>

                    <br>

                    <button id="btn2" style="margin-left: 40px; display: none">Add Owner</button>
                    <div id="own3" style="display: none; margin-left: 40px; border-radius: 6px;">
                        <p>{{ form3.as_p }}</p>
                    </div>

                    <br>

                    <button id="btn3" style="margin-left: 40px; display: none">Add Owner</button>
                    <div id="own4" style="display: none; margin-left: 40px; border-radius: 6px;">
                        <p>{{ form4.as_p }}</p>
                    </div>

                    <br>

                    <button id="btn4" style="margin-left: 40px; display: none">Add Owner</button>
                    <div id="own5" style="display: none; margin-left: 40px; border-radius: 6px;">
                        <p>{{ form5.as_p }}</p>
                    </div>

                </div>

我的add_owner.js文件:

const btn1 = document.getElementById("btn1")
const btn2 = document.getElementById("btn2")
const btn3 = document.getElementById("btn3")
const btn4 = document.getElementById("btn4")

# own1 is not included, because the first owner form is required and never changes or hides
const own2 = document.getElementById("own2")
const own3 = document.getElementById("own3")
const own4 = document.getElementById("own4")
const own5 = document.getElementById("own5")

btn1.onclick = function(e){
    e.preventDefault();
    if(btn1.innerHTML === "Add Owner"){
        btn1.innerHTML = "Remove";
        if(btn2.style.display === "none" && own2.style.display === "none"){
            btn2.style.display = "block";
            own2.style.display = "block";
        }
        else if (btn2.style.display === "block" && own2.style.display === "block"){
            btn2.style.display = "none";
            own2.style.display = "none";
        }
    }
    /*close the div*/
    else{
        btn1.innerHTML = "Add Owner"
        if(own2.style.display === "block" && btn2.style.display === "block"){
            own2.style.display = "none"
            btn2.style.display = "none"
        }
    }

}

btn2.onclick = function(e){
    e.preventDefault();
    if(btn2.innerHTML === "Add Owner"){
        btn2.innerHTML = "Remove";
        btn1.disabled = true
        /*Display button 3 and owner 3*/
        if(btn3.style.display === "none" && own3.style.display === "none"){
            btn3.style.display = "block";
            own3.style.display = "block";
        }  /*hide button 3 and owner 3*/
        else if (btn3.style.display === "block" && own3.style.display === "block"){
            btn3.style.display = "none";
            own3.style.display = "none";
        }
    }
    /*close the div*/
    else{
        btn2.innerHTML = "Add Owner"
        if(own3.style.display === "block" && btn3.style.display === "block"){
            own3.style.display = "none"
            btn3.style.display = "none"
            btn1.disabled = false
        }
    }
}

btn3.onclick = function(e){
    e.preventDefault();
    if(btn3.innerHTML === "Add Owner"){
        btn3.innerHTML = "Remove";
        btn2.disabled = true
        /*Display button 3 and owner 3*/
        if(btn4.style.display === "none" && own4.style.display === "none"){
            btn4.style.display = "block";
            own4.style.display = "block";
        }  /*hide button 3 and owner 3*/
        else if (btn4.style.display === "block" && own4.style.display === "block"){
            btn4.style.display = "none";
            own4.style.display = "none";
        }
    }
    /*close the div*/
    else{
        btn3.innerHTML = "Add Owner"
        if(own4.style.display === "block" && btn4.style.display === "block"){
            own4.style.display = "none"
            btn4.style.display = "none"
            btn2.disabled = false
        }
    }
}


btn4.onclick = function(e){
    e.preventDefault();
    if(btn4.innerHTML === "Add Owner"){
        btn4.innerHTML = "Remove";
        btn3.disabled = true
        if(own5.style.display === "none"){
            own5.style.display = "block";
        }  /*hide button 3 and author 3*/
        else if (own5.style.display === "block"){
            own5.style.display = "none";
        }
    }
    /*close the div*/
    else{
        btn4.innerHTML = "Add iOwner"
        if(own5.style.display === "block"){
            own5.style.display = "none"
            btn3.disabled = false
        }
    }
}


Tags: namedivformnoneid表单ifstyle
2条回答
            form_ownerset.instance.owner1 = owner1
            form_ownerset.instance.owner2 = owner2
            form_ownerset.instance.owner3 = owner3
            form_ownerset.instance.owner4 = owner4
            form_ownerset.instance.owner5 = owner5

完成以上所有操作后,请致电:

            form_ownerset.instance.save()

如果仍然不起作用,请先尝试保存表单,而不必访问实例,然后编辑并保存:

            instance = form_ownerset.save(commit=False)
            instance.owner2 = owner2
            instance.owner3 = owner3
            instance.owner4 = owner4
            instance.owner5 = owner5
            instance.save()

或者更清楚地说:

            ownerset = form_ownerset.save(commit=False)
            ownerset.owner1 = owner1
            ownerset.owner2 = owner2
            ownerset.owner3 = owner3
            ownerset.owner4 = owner4
            ownerset.owner5 = owner5
            ownerset.save()

            company = form_company.save(commit=False)
            company.ownerset = ownerset
            company.save()

问题在于我的OwnerSet功能。在forms.py中,我定义了我希望owner1_id是一个字段,但我从未将任何数据传递到该字段中,也从未真正使用过它。每当我尝试提交数据时,这会在命令终端中抛出一个validationError,这会擦除POST请求,因此没有数据发送到数据库。删除forms.py中的OwnerSet表单并将所有OwnerSet ID发送到views.py中的company解决了此问题,数据再次提交到我的数据库

相关问题 更多 >

    热门问题