【问题标题】:django forms - Access fields of a foreign keydjango forms - 外键的访问字段
【发布时间】:2012-08-23 23:26:50
【问题描述】:

我想从具有模型 B 外键的模型 A 创建一个模型表单:

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,但是我没有看到任何限制内联字段集的东西。

我该怎么办?谢谢。

【问题讨论】:

标签: django django-forms inline-formset


【解决方案1】:

您可以像这样限制内联字段(当然您仍然需要表单来验证,您可以使用 javascript 或默认值来设置间隙)

class MyModelInline(admin.TabularInline):
    model = MyModel
    fields = ["x", "y", "z"]

    #fk_name = "..."
    #max_num = 1
    #extra = 0

【讨论】:

【解决方案2】:

如果您想在选择字段中显示正确的“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

【讨论】:

    【解决方案3】:

    inlineformset_factory 接受 form 参数,这是您的“B”对象的模型类。因此,在Meta 中使用fields = ('a', 'b') 定义一个表单类并将其传递给函数应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2018-11-17
      • 2011-05-10
      • 2013-06-08
      • 2020-10-20
      • 2015-04-25
      相关资源
      最近更新 更多