django forms - 访问外键的字段

时间:2012-08-29 11:03:34

标签: django django-forms inline-formset

我想从模型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,但我没有看到任何限制内联字段集的内容。

我该怎么办?感谢。

3 个答案:

答案 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的表单类并将其传递给该函数应该会有所帮助。