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 场景