2009-12-28 156 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继承)。