2013-06-17 30 views
7

Tôi đang gặp sự cố với dự án Django mà tôi đang làm việc. Bây giờ tôi có hai ứng dụng, yêu cầu một chút trùng lặp. Tôi đã thực sự chỉ bắt đầu dự án thứ hai (gọi là workflow) và tôi đang cố gắng tạo biểu mẫu đầu tiên cho ứng dụng đó. Đơn đăng ký đầu tiên của tôi được gọi là po. Trong ứng dụng workflow Tôi có một lớp được gọi là WorkflowObject, mà (hiện tại) chỉ có một thuộc tính duy nhất - một khóa ngoại cho một số PurchaseOrder, được xác định trong po/models.py. Tôi đã nhập lớp học đó với from po.models import PurchaseOrder.Django: ValueError: Không thể tạo trường biểu mẫu vì mô hình liên quan của nó chưa được tải

Điều tôi đang cố gắng thực hiện là có một trang nơi người dùng tạo một PurchaseOrder mới. Điều này làm việc tốt (đó là hình thức tương tự mà tôi đã sử dụng trong ứng dụng PurchaseOrder của tôi), và sau đó sử dụng trường hợp đó của lớp học để tạo ra một WorkflowObject. Vấn đề bây giờ, là tôi nhận được lỗi: ValueError: Cannot create form field for 'purchase' yet, because its related model 'PurchaseOrder' has not been loaded yet. Tôi thực sự không chắc chắn nên bắt đầu từ đâu. Nó hoạt động ổn định (cho phép tôi tạo một PurchaseOrder mới và chuyển tiếp tới url có khóa chính trong url) cho đến khi tôi thêm chế độ xem cho phép tôi tạo WorkflowObject mới. Tôi sẽ đưa độ xem cụ thể ở đây:

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

Các dòng mã mà dường như được gây ra lỗi (hoặc ít nhất, một trong những dòng được hiển thị trong traceback) là:

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

EDIT: tôi dường như đã thực hiện một sai lầm rất noob, và bao gồm dấu ngoặc đơn trong định nghĩa của tôi về WorkflowObject, có nghĩa là, tôi đã nói purchase=models.ForeignKey('PurchaseOrder'), thay vì purchase=models.ForeignKey(PurchaseOrder)

+0

Bạn nên thử tải ứng dụng PurchaseOrder trước ứng dụng WorkflowForm trong cài đặt của mình. Điều đó có thể hiệu quả. – tsurantino

Trả lời

0

Thứ nhất, bạn có thể thử giảm mã để:

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

Thứ hai, tôi không hiểu tại sao bạn ở trường hợp khác đã viết forms.ModelChoiceField(...) và một ví dụ trường hợp ModelFormforms.ModelForm?

0

vẻ, rằng có gì đặc biệt trong WorkflowForm của bạn, vì vậy bạn có thể định nghĩa nó như sau:

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

Dòng cho mối quan hệ sẽ được tạo ra tự động.

Tài liệu: Creating forms from models

0

Tôi đã có một vấn đề tương tự và đã có thể giải quyết điều này bằng cách tuyên bố tất cả các lớp ModelForm của tôi dưới đây tất cả các mô hình lớp học của tôi trong tập tin models.py tôi. Bằng cách này, các lớp mô hình được nạp trước các lớp modelForm.

Các vấn đề liên quan