2013-01-04 32 views
10

Trong bản cài đặt OpenERP của tôi, tôi có trường sau đây, không cần thiết trước đó, nhưng tôi đã thay đổi đối số được yêu cầu thành True.Làm cách nào để tạo trường trong OpenERP chỉ yêu cầu cho trạng thái luồng công việc cụ thể?

'fiscal_position': fields.many2one(
    'account.fiscal.position', 
    'Fiscal Position', 
    required=True, 
    readonly=True, 
    states={'draft':[('readonly',False)]} 
    ), 

Trong nhật ký gỡ lỗi, tôi thấy rằng ORM cố gắng đặt ràng buộc không rỗng cho trường đó trong cơ sở dữ liệu.

2013-01-04 15:28:56 EET STATEMENT: ALTER TABLE "account_invoice" 
    ALTER COLUMN "fiscal_position" SET NOT NULL 

Làm cách nào để ngăn chặn điều đó? Ý tưởng của tôi là có cờ True bắt buộc, chỉ cho các bản ghi mới và không có ràng buộc NOT NULL. Trong trường hợp khác lỗi vẹn PostgreSQL xảy ra:

IntegrityError: null value in column "fiscal_position" violates 
    not-null constraint 

Vì vậy, làm thế nào tôi có thể có một trường bắt buộc trong giao diện hình thức, mà không làm cho ORM chạm vào những hạn chế chương trình cơ sở dữ liệu? Hoặc làm thế nào tôi có thể thay đổi trường được yêu cầu động, theo trạng thái của đối tượng?

Trả lời

12

Để thực hiện một trường chỉ yêu cầu trong một số bang, hãy để nó là không cần thiết trong mô hình, và trong giao diện mẫu quy định các điều kiện trên mà lĩnh vực này sẽ được yêu cầu:

<field 
    name="fiscal_position" 
    attrs="{'required':[('state','in',['pending','open'])]}" 
    /> 
+0

Cảm ơn sự giúp đỡ. –

5

Nếu bạn viết required=True trong tập tin .py thì ORM sẽ thêm không ràng buộc vào trường đó.

Có nhiều cách để làm mã của bạn.

  1. Làm cho required=True đặt và đặt giá trị mặc định cho trường đó.
  2. Tạo required=False và đặt required=True trong view.xml.
  3. Tạo required=False và đặt required=True trong view.xml đối với một số trạng thái của đối tượng.

Điều này có thể giúp giải quyết vấn đề của bạn.

+0

Cảm ơn. Sẽ thử điều đó nữa. –

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