Django:值错误:无法创建表单域,因为其相关模型尚未加载

prdp8dxp  于 2022-11-26  发布在  Go
关注(0)|答案(4)|浏览(147)

我正在做的Django项目遇到了一些麻烦。我现在有两个应用程序,它们需要相当多的重叠。我实际上只开始了第二个项目(名为workflow),我正在尝试为该应用程序创建第一个窗体。我的第一个应用程序名为po。在workflow应用程序中,我有一个名为WorkflowObject的类,这个类(目前)只有一个属性--PurchaseOrder的外键,它在po/models.py中定义。
我尝试做的是有一个页面,用户在其中创建一个新的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)

8ljdwjyq

8ljdwjyq1#

我也遇到过类似的问题,通过在www.example.com文件中的所有类模型下面声明所有modelForm类,可以解决这个问题models.py。

aiazj4mn

aiazj4mn2#

首先,您可以尝试将代码减少到:

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

eoxn13cs

eoxn13cs3#

似乎,在你的WorkflowForm中没有什么特别的东西,所以你可以如下定义它:

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

将自动创建关系字段。
文件:Creating forms from models

oxcyiej7

oxcyiej74#

刚刚遇到了这个问题。我在ForeignKey的to=值中有一个字符串值(故意的)。抛出这个错误是因为我将我的应用的名称messages更改为messaging(因为messagesdjango.contrib.messages冲突),但忘记更改模型的ForeignKey字符串值。
例如:

# messaging/models.py

class Thread(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, unique=True)

class Message(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    thread = models.ForeignKey('messages.Thread', on_delete=models.CASCADE) # <- here!

错误:

ValueError: Cannot create form field for 'thread' yet, because its related model 'messages.Thread' has not been loaded yet

解决办法很简单:

models.ForeignKey('messages.Thread', ...

至:

models.ForeignKey('messaging.Thread', ...

相关问题