Django:ValueError:无法创建表单字段,因为尚未加载其相关模型

时间:2013-06-17 19:36:09

标签: python django forms

我正在处理一个正在研究的Django项目。我现在有两个应用程序,需要相当多的重叠。我真的只开始了第二个项目(名为workflow),我正在尝试为该应用程序创建我的第一个表单。我的第一个应用程序叫做po。在workflow应用程序中,我有一个名为WorkflowObject的类,它(现在)只有一个属性 - PurchaseOrder的外键,在{{1}中定义}。我已使用po/models.py导入该类。

我要做的是拥有一个用户创建新from po.models import PurchaseOrder的页面。这工作正常(它与我在PurchaseOrder应用程序中使用的形式相同),然后使用该类的实例创建PurchaseOrder。现在的问题是,我收到错误:WorkflowObject。我真的不知道从哪里开始。它工作正常(允许我创建一个新的ValueError: Cannot create form field for 'purchase' yet, because its related model 'PurchaseOrder' has not been loaded yet并转发到网址中包含其主键的网址),直到我添加了应该允许我创建新PurchaseOrder的视图。我将把这个具体观点放在这里:

WorkflowObject

似乎导致错误的代码行(或者至少是回溯中显示的行之一)是:

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404
from django_tables2 import RequestConfig
from po.models import PurchaseOrderForm, PurchaseOrder
from workflow.models import POObject, WorkflowForm


def new2(request, number):
 po=PurcchaseOrder.objects.get(pk=number)
 if request.method == 'POST':
   form = WorkflowForm(request.POST)
   if form.is_valid():
      new_flow = form.save()
      return HttpResponse('Good')
   else:
      return render(request, 'new-workflow.html', {'form': form, 'purchase': po})
  else:
    form = WorkflowForm()
    return render(request, 'new-workflow.html', {'form': form, 'purchase': po})

编辑: 我似乎犯了一个非常的noob错误,并在class WorkflowForm(ModelForm): purchase = forms.ModelChoiceField(queryset = PurchaseOrder.objects.all()) 的定义中加入了括号,也就是说,我曾说过WorkflowObject,而不是purchase=models.ForeignKey('PurchaseOrder')

3 个答案:

答案 0 :(得分:0)

首先,您可以尝试将代码缩减为:

def new2(request, number):
    po=PurcchaseOrder.objects.get(pk=number)

    form = WorkflowForm(request.POST or None)
    if form.is_valid():
        new_flow = form.save()
        return HttpResponse('Good')
    else:
        return render(request, 'new-workflow.html', {'form': form, 'purchase': po})

其次,我不明白为什么你在其他情况下写了forms.ModelChoiceField(...)和另一个案例ModelForm实例forms.ModelForm

答案 1 :(得分:0)

似乎您的WorkflowForm没有什么特别之处,因此您可以按如下方式定义它:

class WorkflowForm(ModelForm):
    class Meta:
        model = WorkflowObject

将自动创建关系字段。

文档:Creating forms from models

答案 2 :(得分:0)

我遇到了类似的问题,并且能够通过在models.py文件中的所有类模型下面声明所有的modelForm类来解决这个问题。这样,模型类在modelForm类之前加载。