我想从模型A创建一个模型形式,它具有模型B的外键:
class A(models.Model):
a = models.CharField(...)
b = models.ForeignKey(B)
c = models.CharField(...)
class B(models.Model):
a = models.IntegerField(...)
b = models.CharField(...)
c = models.BooleanField(...)
所以我这样做了:
class AForm(forms.ModelForm):
class Meta:
model = A
但我只想要一些字段:
class AForm(forms.ModelForm):
class Meta:
model = A
fields = ('a', 'b')
问题出在这里,我不希望b成为B对象的列表,但我想要字段B.a和B.c(例如)。我试过“fields =('a','b.a','b.c')”和“fields =('a','b_ a',b _c')”但是徒劳。
所以我来到inline formsets,但我没有看到任何限制内联字段集的内容。
我该怎么办?感谢。
答案 0 :(得分:1)
你可以像这样限制内联字段(当然你还需要表单来验证,你可以使用javascript或默认值来设置间隙)
class MyModelInline(admin.TabularInline):
model = MyModel
fields = ["x", "y", "z"]
#fk_name = "..."
#max_num = 1
#extra = 0
答案 1 :(得分:0)
如果您想在选择字段中显示“B”的正确文字,请在模型B
中添加__unicode__
方法并使用B
字段返回字符串,
例如
class B(models.Model):
a = models.IntegerField(...)
b = models.CharField(...)
c = models.BooleanField(...)
def __unicode__(self):
return u''+str(self.a) + ':' + self.b
答案 2 :(得分:0)
inlineformset_factory
接受form
参数,它是“B”对象的模型类。因此,在fields = ('a', 'b')
中定义一个Meta
的表单类并将其传递给该函数应该会有所帮助。