Django:limit_choices_to(这是正确的)

Posted

技术标签:

【中文标题】Django:limit_choices_to(这是正确的)【英文标题】:Django: limit_choices_to (Is this correct) 【发布时间】:2010-12-30 10:17:27 【问题描述】:

这对吗?

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'

【问题讨论】:

不明白你的问题。你能说得清楚一点吗? 【参考方案1】:

“它是否正确”的唯一答案是“运行时它是否有效?”答案当然是否定的,所以我不知道你为什么在这里问。

无法根据当前模型中另一个字段的值动态使用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)

【讨论】:

仅仅因为它对我不起作用并不意味着它必须是错误的方法。我问是因为 Django 网站上没有关于此功能的明确文档,而且我不确定我的语法是否正确。 如果您需要在 MyOrderForm 类中有请求 obj,这也很好 -> ***.com/a/6062628/758202 是的,这在文档中不是很清楚。我想问题是 limit_choices_to 是 ForeignKey 函数的参数,并且该函数必须分配给类成员。在这个级别上,self 没有任何意义。为了让它工作,Django 应该有一个在__init__ 中工作的过滤器功能,据我所知,它没有。【参考方案2】:

您应该在构造函数中设置您的订单的choices字段(继承自ModelForm)。

【讨论】:

【参考方案3】:

limit_choices_to='account': 'self.account' 错误,因为客户的外键不能指向Account

【讨论】:

客户有“帐户”属性。还是这样?

以上是关于Django:limit_choices_to(这是正确的)的主要内容,如果未能解决你的问题,请参考以下文章

Django ForeignKey.limit_choices_to 与 ForeignKey to ManyToMany 场景

Django-form组件中过滤当前用户信息

limit_choices_to

django-外键和表关系

自定义组件之crm的业务逻辑

54.1 怎样才算学会django? 知道这28个知识点才算会django2