2009-12-28 115 views
21

這是正確的嗎?Django:limit_choices_to(這是否正確)

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

我試圖確保訂單窗體只顯示屬於與訂單相同的客戶選項。

如果我忽略了一些明顯的不良設計謬誤,請告訴我。

我關心的主要問題是:

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

不理解您的問題。你能更清楚嗎? – Mayuresh 2009-12-28 11:02:06

回答

18

「它是否正確」的唯一答案是'它運行時是否有效?'當然,答案是否定的,所以我不知道你爲什麼問這裏。

根據當前模型中另一個字段的值,無法動態使用limit_choices_to進行限制。最好的方法是通過自定義表單。定義一個ModelForm子類,並覆蓋__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

僅僅因爲它對我不起作用並不意味着它必須是錯誤的方法。我問,因爲Django網站上沒有關於此功能的明確文檔,我不確定我的語法是否正確。 – orokusaki 2009-12-28 17:24:32

+0

這也是好的,如果你需要在課堂MyOrderForm要求OBJ - > http://stackoverflow.com/a/6062628/758202 – zzart 2013-03-07 09:15:30

+0

是的,這是不是在文檔非常清晰。我想問題是'limit_choices_to'是ForeignKey函數的一個參數,並且該函數必須被分配給一個類成員。在這個層面上,「自我」意味着什麼。爲了使它工作,'Django'應該有一個在'__init__'中工作的過濾函數,而且據我所知,它沒有一個。 – 2014-11-16 16:54:31

-1

limit_choices_to={'account': 'self.account'}是錯誤的,因爲外鍵的客戶不能指向Account

+0

儘管客戶有「帳戶」屬性。仍然是這種情況? – orokusaki 2009-12-28 17:19:16

0

您應該在構造函數中設置您的訂單的choices字段(從ModelForm繼承)。