2013-06-17 10 views
7

Ich habe Probleme mit einem Django-Projekt, an dem ich gerade arbeite. Ich habe jetzt zwei Anwendungen, die ein gewisses Maß an Überlappung erfordern. Ich habe wirklich nur das zweite Projekt gestartet (workflow) und ich versuche, meine erste Form für diese Anwendung zu machen. Meine erste Anwendung heißt po. In der workflow Anwendung habe ich eine Klasse namens WorkflowObject, die (für jetzt) ​​hat nur ein einziges Attribut - ein Fremdschlüssel zu einem PurchaseOrder, der in po/models.py definiert ist. Ich habe diese Klasse mit from po.models import PurchaseOrder importiert.Django: ValueError: Formularfeld kann nicht erstellt werden, da das zugehörige Modell noch nicht geladen wurde

Was ich versuche zu tun, ist eine Seite, wo ein Benutzer eine neue PurchaseOrder erstellt. Dies funktioniert einwandfrei (es ist das gleiche Formular, das ich in meiner PurchaseOrder-Anwendung verwendet habe) und verwendet dann diese Instanz der Klasse, um eine WorkflowObject zu erstellen. Das Problem jetzt ist, dass ich den Fehler bekomme: ValueError: Cannot create form field for 'purchase' yet, because its related model 'PurchaseOrder' has not been loaded yet. Ich bin mir wirklich nicht sicher, wo ich damit anfangen soll. Es funktionierte ok (erlaubt mir, eine neue PurchaseOrder zu erstellen und an eine URL mit seinem Primärschlüssel in der URL weiterzuleiten), bis ich die Ansicht hinzugefügt habe, die mir erlauben sollte, eine neue WorkflowObject zu erstellen. Ich werde hier, dass bestimmte Ansicht setzen:

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}) 

Die Zeilen Code, der den Fehler zu sein scheinen verursacht (oder zumindest eine der Leitungen, die in der Rückverfolgungs gezeigt wird) ist:

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

EDIT: ich scheine einen sehr Noob Fehler gemacht zu haben, und enthalten Klammern in meiner Definition von WorkflowObject, das heißt, hatte ich gesagt purchase=models.ForeignKey('PurchaseOrder'), statt purchase=models.ForeignKey(PurchaseOrder)

+0

Sie sollten versuchen, die PurchaseOrder App vor der WorkflowForm App in Ihren Einstellungen zu laden. Das könnte funktionieren. – tsurantino

Antwort

0

zum einen können Sie versuchen, Code zu reduzieren:

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}) 

Zweitens habe ich nicht verstanden, warum man bei anderen Fall forms.ModelChoiceField(...) geschrieben und ein weiterer Fall ModelForm Instanz forms.ModelForm?

0

scheint, dass es nichts Besonderes in Ihrem WorkflowForm, so können Sie es wie folgt definieren:

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

Feld für die Beziehung automatisch erstellt wird.

Dokumentation: Creating forms from models

0

hatte ich ein ähnliches Problem und konnte diese alle Klassen meiner Modelform unter alle meiner Klasse Modelle in meiner models.py Datei, indem er erklärt lösen. Auf diese Weise wurden die Modellklassen vor den modelForm-Klassen geladen.

Verwandte Themen