从多个模型创建modelform以添加到数据库?

2024-04-20 07:22:18 发布

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

在我的postgressql数据库中,我有表:

class Topic(models.Model):
    Definition = models.TextField(default='Definition')
    Name = models.TextField(default='Name')

    def __str__(self):
       return self.Name

class Question(models.Model):
    Statement = models.TextField(default='Question')

    def __str__(self):
        return self.Statement

class Planit_location(models.Model):
    Planit_location = models.CharField(max_length=255, default='Planit_location')

    def __str__(self):
        return self.Planit_location

class ClientDetail(models.Model):
    Sector = models.ForeignKey(Sector, on_delete=models.CASCADE)
    Client_name = models.CharField(max_length=255, default='Client_name')

    def __str__(self):
        return self.Client_name

class Response(models.Model):
    Question = models.ForeignKey(Question, on_delete=models.CASCADE)
    Topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    Response = models.TextField(default='Response')
    Client = models.ForeignKey(ClientDetail, on_delete=models.CASCADE)
    Planit_Location = models.ForeignKey(Planit_location, on_delete=models.CASCADE)
    Image = models.ForeignKey(Image, on_delete=models.CASCADE)

    def __str__(self):
        return self.Response

我想使用所有这些表创建一个modelform,这样我就可以向我的数据库添加新的问题和回答,然后这些问题和回答链接到主题、位置和客户机(这3个将是来自db中数据的dropdownlist

我已经设法创建了一个modelform用于提问和回答,但是当我试图提交它时,我得到了"null value in column "Question_id" violates not-null constraint"

代码如下:

 if request.method == 'POST':
    qform = QuestionForm(request.POST)
    rform = ResponseForm(request.POST)
    if qform.is_valid() and rform.is_valid():
        qf = qform.save()
        rf = rform.save()
        return render(request, 'app/adddatatest.html', {
           "qform": QuestionForm(),
           "rform": ResponseForm(),
        })

Tags: selfdefaultmodelreturnonmodelsdeflocation
1条回答
网友
1楼 · 发布于 2024-04-20 07:22:18

检查视图中的is\ u valid()后,请执行以下操作:

qf = qform.save() # Goes to database
rf = rform.save(commit=False) # Doesn't goes to database
rf.Question = qf # gets required attribute
rf.save() # then goes to database

如果不指定外键问题,则无法保存响应对象。所以在rform.save中,传递参数commit=False到目前为止还没有实际将其保存到数据库中。然后将外键的值添加到新创建的响应对象中,外键是必需的,否则您将得到IntegrityError。最后保存到数据库

相关问题 更多 >