1

如何访问 ModelForm 中关联的模型对象?像 self.Meta.model 这样的东西?我的模型和表单定义如下,我试图通过“self.Meta.model.attribute”访问模型的属性,但这不起作用。

class Attribute(models.Model):
    name = models.CharField(max_length=64)

class AttributeIndex(models.Model):
    product = models.OneToOneField(Product)
    attribute = models.ManyToManyField(Attribute)

class AttributeIndexForm(forms.ModelForm):
    class Meta: 
        model = AttributeIndex  
    def __init__(self, *args, **kwargs):
        super(AttributeIndexForm, self).__init__(*args, **kwargs)
        self.fields['attribute'] = forms.ModelMultipleChoiceField(queryset=self.Meta.model.attribute.all, widget=widgets.FilteredSelectMultiple("Attributes", is_stacked=False))
4

2 回答 2

2

当你声明一个模型时

class MyModel(models.Model):
    class Meta:
        something = 'foo'

或带有的 ModelForm

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

有一个特殊的元类,在“读取”您的类定义时,它Meta会将属性设置/替换为_meta.

因此,为了访问您的 ModelForm 中的关联模型,请执行以下操作:

AttributeIndexForm._meta.model

但是在您只想自定义attribute字段的查询集的特定情况下,您应该这样做:

class AttributeIndexForm(forms.ModelForm):
    class Meta: 
        model = AttributeIndex  
    def __init__(self, *args, **kwargs):
        super(AttributeIndexForm, self).__init__(*args, **kwargs)
        self.fields['attribute'].queryset = Attribute.objects.filter(..condition..)
        self.fields['attribute'].widget = widgets.FilteredSelectMultiple("Attributes", is_stacked=False))
于 2012-11-14T23:49:01.353 回答
0

我发现“self.instance”有效,这正是我想要的:

 self.fields['attribute'].queryset = self.instance.attribute.all()
于 2012-11-15T00:51:29.213 回答