这是正确的吗?
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'}
“它是否正确”的唯一答案是“运行它时它有效吗?”答案当然是否定的,所以我不知道你为什么在这里问。
无法动态使用 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)
您应该在构造函数中设置订单表单的
choices
字段(继承自 ModelForm
)。
我用views.py中的这些函数解决了这个问题,其中volumeSets是一个多对多字段。但该表格并未经过验证。 (Django 4.2)我正在检索发布的值:
profile = request.user.profile
formData = request.POST.items()
for key, value in formData:
if key == 'volumeSets':
volumeSetIndex = int(value) - 1
volumeSet = profile.volumeSets.all()[volumeSetIndex]
elif key == 'volumeType':
volumeType = int(value)
def setProfileFormInitial(formProfile, profile):
'''
This method sets the initial values for the choices of the profile form.
:param formProfile: form for the Profile model
:param profile: Profile model
'''
formProfile.initial = {
"volumeSets":int(profile.volumeSetChoiceSelected),
"volumeType":profile.volumeTypeChoiceSelected
}
def createProfileForm(profile):
'''
This method creates a profile form.
:param profile: Profile model
:returns: Profile form
'''
formProfile = ProfileEditForm()
field = formProfile.fields["volumeSets"]
field.queryset = profile.volumeSets.all()
setProfileFormInitial(formProfile, profile)
return formProfile
limit_choices_to={'account': 'self.account'}
是错误的,因为客户的外键不能指向 Account
。