Django:limit_choices_to(这是正确的吗)

问题描述 投票:0回答:4

这是正确的吗?

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'}
django django-models foreign-keys
4个回答
24
投票

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

无法动态使用 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)

0
投票

您应该在构造函数中设置订单表单的

choices
字段(继承自
ModelForm
)。


0
投票

我用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

-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.