所以我正在扩展官方教程,我试图让用户创建自己的民意调查。我无法在选择中分配正确的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具有不同的值。我在这里不知所措,并且不太了解发生了什么。任何帮助将不胜感激。
答案 0 :(得分:0)
您的代码有点令人困惑,因为您使用变量poll
来提问和选择。最好使用question
和choice
代替。
在开始保存之前,您应该检查两个表单是否有效,否则如果问题表单有效但选择表格无效,您可以在没有选择的情况下结束问题。
保存问题后,您可以使用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_form
和choice_form
,对类使用大写QuestionForm
和ChoiceForm
。< / p>