如何访问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))
答案 0 :(得分:1)
使用
声明模型时class MyModel(models.Model):
class Meta:
something = 'foo'
或带
的ModelFormclass MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
有一个特殊的metaclass,在“阅读”你的班级定义之后
其他方面,它将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))
答案 1 :(得分:0)
我发现“self.instance”有效,这正是我想要的:
self.fields['attribute'].queryset = self.instance.attribute.all()