【问题标题】:django get primary key after saving modelform and pass it to the second form but second form can't be saveddjango在保存modelform后获取主键并将其传递给第二种形式,但第二种形式无法保存
【发布时间】:2021-05-06 11:36:36
【问题描述】:

我有一个模型表单,在保存表单后我得到主键并将其传递给第二个表单,但有些如何不保存第二个表单数据。我不确定我做错了什么。

def create_new_survey(request):
    if request.method == 'POST':
        form = NewSurveyForm(request.POST)
        if form.is_valid():
            new_survey = form.save()
            return HttpResponseRedirect(reverse(add_question, args=(new_survey.pk,)))
           

    else:
        form = NewSurveyForm()
    return render(request, 'create_new_survey.html', {'form': form})


def add_question(request, survey_id):
    if request.method == 'POST':
        person = Survey.objects.get(id=survey_id)
        form = QuestionForm(request.POST, instance=person)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/choice')
    else:
        form = QuestionForm()
        return render(request, 'question.html', {'form': form},)

型号:

class Survey(models.Model):
    title = models.CharField(max_length=200)
    #creator = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title


class Questions(models.Model):
    survey = models.ForeignKey(Survey, on_delete=models.CASCADE)
    enter_question = models.CharField(max_length=900)

    def __str__(self):
        return self.enter_question

表格:

class QuestionForm(forms.ModelForm):
    class Meta:
        model = Questions
        fields = ('enter_question',)

【问题讨论】:

  • 请将您的表格添加到问题中。为什么要将Survey的实例传递给QuestionForminstance 应该是表单正在保存的对象,考虑到表单是针对 Questions 的,如果您将其传递给实例,它应该是 Questions 的实例。

标签: django


【解决方案1】:

在您看来add_question 您将表单定义为form = QuestionForm(request.POST, instance=person),但这里personSurvey 的实例而不是Questionsinstance 关键字参数用于更新特定实例而不指定外键。

如果你想指定外键,你可以简单地修改表单包裹的实例或者提供一个未保存的Questions实例:

def add_question(request, survey_id):
    if request.method == 'POST':
        person = Survey.objects.get(id=survey_id)
        form = QuestionForm(request.POST) # Remove instance from here
        if form.is_valid():
            form.instance.survey = person # Specify foreign key here
            form.save()
            return HttpResponseRedirect('/choice')
    else:
        form = QuestionForm()
        return render(request, 'question.html', {'form': form},)

注意: 模型名称在 Django 中最好是单数,因为通常 Django 通过添加 s 来自动创建 verbose_name_plural 型号名称,所以目前它以questionss 为您结束,所以它 应该是 Question 而不是 Questions

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多