Создать модель формы из нескольких моделей для добавления в базу данных? - PullRequest
0 голосов
/ 21 сентября 2018

В моей базе данных 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 будут dropdownlist из данных в db).

Мне удалось создать 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(),
        })

1 Ответ

0 голосов
/ 21 сентября 2018

После проверки на наличие is_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

Невозможно сохранить объект Response без указания внешнего ключа Вопрос.Таким образом, в rform.save передайте аргумент commit=False, чтобы еще не сохранить его в базе данных.Затем добавьте значение для внешнего ключа в новый созданный объект Response, внешний ключ необходим, в противном случае вы получите IntegrityError.Затем, наконец, сохраните его в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...