2009-12-28 29 views
21

Điều này có đúng không?Django: limit_choices_to (Đây có phải là chính xác)

class Customer(models.Model): 
    account = models.ForeignKey(Account) 


class Order(models.Model): 
    account = models.ForeignKey(Account) 
    customer = models.ForeignKey(Customer, limit_choices_to={'account': 'self.account'}) 

Tôi đang cố gắng đảm bảo rằng biểu mẫu Đơn đặt hàng sẽ chỉ hiển thị các lựa chọn của khách hàng thuộc cùng một tài khoản với Đơn đặt hàng.

Nếu tôi đang xem một số sai lầm đáng tiếc về thiết kế xấu, hãy cho tôi biết.

Điều quan trọng tôi là quan tâm đến là:

limit_choices_to={'account': 'self.account'} 
+0

Không hiểu câu hỏi của bạn. Bạn có thể rõ ràng hơn không? – Mayuresh

Trả lời

18

Câu trả lời duy nhất cho 'là đúng' là 'nó có hoạt động khi bạn chạy không?' Câu trả lời cho điều đó tất nhiên là không, vì vậy tôi không biết tại sao bạn lại hỏi ở đây.

Không có cách nào để sử dụng giới hạn_choices_to động để giới hạn dựa trên giá trị của một trường khác trong mô hình hiện tại. Cách tốt nhất để làm điều này là tùy chỉnh biểu mẫu. Xác định lớp con ModelForm và ghi đè phương thức __init__:

class MyOrderForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(MyOrderForm, self).__init__(*args, **kwargs) 
     if 'initial' in kwargs: 
      self.fields['customer'].queryset = Customer.objects.filter(account=initial.account) 
+39

Chỉ vì nó không làm việc cho tôi không có nghĩa là nó phải là phương pháp sai. Tôi hỏi vì không có tài liệu rõ ràng về tính năng này trên trang web Django, và tôi đã không chắc chắn nếu cú ​​pháp của tôi là chính xác. – orokusaki

+0

Điều này cũng tốt nếu bạn cần yêu cầu obj trong lớp MyOrderForm -> http://stackoverflow.com/a/6062628/758202 – zzart

+0

Có, điều này không rõ ràng trong tài liệu. Tôi cho rằng vấn đề là 'limit_choices_to' là một tham số của hàm ForeignKey, và hàm đó phải được gán cho một thành viên của lớp. Ở cấp độ này, 'self' có nghĩa là không có gì. Để làm cho nó hoạt động, 'Django' nên có chức năng lọc hoạt động trong' __init__', và, đối với những gì tôi biết, nó không có. –

-1

limit_choices_to={'account': 'self.account'} là sai, vì chính nước ngoài để khách hàng không có thể trỏ đến Account.

+0

Khách hàng có thuộc tính "tài khoản". Vẫn còn đây là trường hợp? – orokusaki

0

Bạn nên đặt choices trường mẫu đơn đặt hàng của bạn (được kế thừa từ ModelForm) trong hàm tạo.

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