【问题标题】:Django: ValueError: Cannot create form field because its related model has not been loaded yetDjango:ValueError:无法创建表单字段,因为尚未加载其相关模型
【发布时间】:2013-06-13 20:54:01
【问题描述】:

我正在处理的 Django 项目遇到了一些问题。我现在有两个应用程序,它们需要相当多的重叠。我真的只开始了第二个项目(称为workflow),我正在尝试为该应用程序制作我的第一个表单。我的第一个应用程序名为po。在workflow 应用程序中,我有一个名为WorkflowObject 的类,它(目前)只有一个属性——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,其主键在 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)

【问题讨论】:

  • 您应该尝试在设置中的 WorkflowForm 应用程序之前加载 PurchaseOrder 应用程序。这可能行得通。

标签: python django forms


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,您可以尝试将代码简化为:

    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

    【讨论】:

      【解决方案3】:

      看来,你的 WorkflowForm 并没有什么特别之处,所以你可以定义如下:

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

      关系字段将自动创建。

      文档:Creating forms from models

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 2019-05-28
        • 2016-05-25
        相关资源
        最近更新 更多