2013-06-17 8 views
7

Ho qualche problema con un progetto Django su cui sto lavorando. Ora ho due applicazioni, che richiedono un bel po 'di sovrapposizione. Ho solo iniziato il secondo progetto (chiamato workflow) e sto cercando di creare il mio primo modulo per quella applicazione. La mia prima applicazione si chiama po. Nell'applicazione workflow ho una classe denominata WorkflowObject, che (per ora) ha un solo attributo: una chiave esterna a PurchaseOrder, che è definita in po/models.py. Ho importato quella classe con from po.models import PurchaseOrder.Django: ValueError: impossibile creare il campo modulo perché il suo modello correlato non è stato ancora caricato

Quello che sto cercando di fare è avere una pagina in cui un utente crea un nuovo PurchaseOrder. Funziona correttamente (è la stessa forma che ho usato nella mia applicazione PurchaseOrder), e quindi usa quell'istanza della classe per creare un WorkflowObject. Il problema ora è che ottengo l'errore: ValueError: Cannot create form field for 'purchase' yet, because its related model 'PurchaseOrder' has not been loaded yet. Non sono davvero sicuro da dove cominciare. Stava funzionando bene (permettendomi di creare un nuovo PurchaseOrder e inoltrato a un url con la sua chiave primaria nell'url) fino a quando non ho aggiunto la vista che dovrebbe permettermi di creare un nuovo WorkflowObject. Metterò che vista specifica qui:

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

Le righe di codice che sembra essere causa l'errore (o per lo meno, una delle linee che viene mostrato nel traceback) è:

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

EDIT: mi sembra di aver fatto un errore molto niubbo, e comprendeva parentesi nella mia definizione di WorkflowObject, cioè, avevo detto purchase=models.ForeignKey('PurchaseOrder'), invece di purchase=models.ForeignKey(PurchaseOrder)

+0

Si dovrebbe provare a caricare l'app PurchaseOrder prima dell'applicazione WorkflowForm nelle impostazioni. Potrebbe funzionare. – tsurantino

risposta

0

in primo luogo, si può provare ridurre il codice a:

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

In secondo luogo, io non capivo il motivo per cui in altri casi scritto forms.ModelChoiceField(...) e un'altra istanza caso ModelFormforms.ModelForm?

0

pare, che non sono niente di speciale nella tua WorkflowForm, in modo da poter definire come segue:

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

campo per relazione verrà creato automaticamente.

Documentazione: Creating forms from models

0

Ho avuto un problema simile e fu in grado di risolvere questo dichiarando tutte le mie classi ModelForm sotto tutti i miei modelli di classe nel mio file models.py. In questo modo le classi del modello sono state caricate prima delle classi modelForm.

Problemi correlati