为表单分配正确的ID?

时间:2016-07-08 14:28:40

标签: python django

所以我正在扩展官方教程,我试图让用户创建自己的民意调查。我无法在选择中分配正确的question_id,因此选择在数据库中与问题对齐,并且两者都可以被读取。以下是我的观点:

def poll_create(request):
    if request.method == "POST":
        Qform = QuestionForm(request.POST)
        Cform = ChoiceForm(request.POST)
        if Qform.is_valid():
            poll = Qform.save(commit=False)
            poll.author = request.user
            poll.pub_date = timezone.now()
            poll.save()
            if Cform.is_valid():
                poll = Cform.save(commit=False)
                poll.author = request.user
                findid = Question.objects.all().order_by("-id")[0] ##Finds the id of the last question in database
                poll.question_id = findid.id + 1
                poll.save()
                return redirect('polls:detail', pk=poll.pk)
    else:
        Qform = QuestionForm()
        Cform = ChoiceForm()
    return render(request, 'polls/create.html', {'Qform': Qform, 'Cform': Cform})

因此,我们的想法是创建一个问题表单(Qform),将问题写入数据库,然后在网页下面输入一个选择表单(Cform),它将答案写入数据库。我对将问题ID应用于Cform感到很困惑。目前,我有这条线:

findid = Question.objects.all().order_by("-id")[0] ##Finds the id of the last question in database
poll.question_id = findid.id + 1

这似乎是一个非常hacky尝试找到最后一个id并将其分配给下一个id。它没有排队,因为poll.pk具有不同的值。我在这里不知所措,并且不太了解发生了什么。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您的代码有点令人困惑,因为您使用变量poll来提问和选择。最好使用questionchoice代替。

在开始保存之前,您应该检查两个表单是否有效,否则如果问题表单有效但选择表格无效,您可以在没有选择的情况下结束问题。

保存问题后,您可以使用question.id获取ID,然后将问题分配给choice对象。无需查询即可查找最新的问题ID。

将它们放在一起,你就有了类似的东西:

if Qform.is_valid() and Cform.is_valid():
    question = Qform.save(commit=False)
    question.author = request.user
    question.pub_date = timezone.now()
    question.save()
    choice = Cform.save(commit=False)
    choice.author = request.user
    choice.question = question
    choice.save()
    return redirect('polls:detail', pk=question.pk)

另请注意,建议对表单实例使用小写question_formchoice_form,对类使用大写QuestionFormChoiceForm。< / p>