7

我正在处理的 Django 项目遇到了一些问题。我现在有两个应用程序,它们需要相当多的重叠。我真的只开始了第二个项目(称为workflow),我正在尝试为该应用程序制作我的第一个表单。我的第一个应用程序称为po. 在workflow应用程序中,我有一个名为 的类WorkflowObject,它(目前)只有一个属性——a 的外键PurchaseOrder,在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并转发到一个带有主键的 url),直到我添加了应该允许我创建一个新的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})

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

class WorkflowForm(ModelForm):
   purchase = forms.ModelChoiceField(queryset = PurchaseOrder.objects.all())

编辑:我似乎犯了一个非常菜鸟的错误,并在我的定义中包含了括号WorkflowObject,也就是说,我说过purchase=models.ForeignKey('PurchaseOrder'),而不是purchase=models.ForeignKey(PurchaseOrder)

4

3 回答 3

1

看起来,您的 WorkflowForm 没有什么特别之处,因此您可以将其定义如下:

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

关系字段将自动创建。

文档:从模型创建表单

于 2013-06-17T19:52:19.957 回答
1

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

于 2013-09-09T21:19:50.593 回答
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

于 2013-06-17T19:42:44.910 回答