【问题标题】:Dynamic Form fields in `__init__` in Django adminDjango admin中`__init__`中的动态表单字段
【发布时间】:2011-07-22 09:39:17
【问题描述】:

我希望能够在运行时向 django 管理表单添加字段。我的模型和形式:

#admin.py
class SitesForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(SitesForm, self).__init__(*args, **kwargs)

        self.fields['mynewfield'] = forms.CharField()

class SitesAdmin(admin.ModelAdmin):
    form = SitesForm

admin.site.register(Sites,SitesAdmin)

#model.py
class Sites(models.Model):
    url = models.URLField(u'URL')
    is_active = models.BooleanField(default=True, blank=True)
    is_new = models.BooleanField(default=False, blank=True)
    group = models.ForeignKey('SitesGroup')
    config = models.TextField(blank=True)

字段mynewfield 不显示在表单中。为什么?

【问题讨论】:

  • 我只需要使用__init____
  • 您应该在 forms.CharField() 中提供 max_length,它可能会静默失败并在 ModelAdmin 中提供:class Meta: model = Sites

标签: django django-models django-admin field


【解决方案1】:

您不应该以这种方式向表单添加新字段,您可以像添加任何其他字段一样添加新字段,并且表单将包含模型的原始字段和新字段:

class SitesForm(forms.ModelForm):
  mynewfield = forms.CharField(max_length=255, blank=True)

  class Meta:
    model = Sites

class SitesAdmin(admin.ModelAdmin):
  form = SitesForm

admin.site.register(Sites, SitesAdmin)

编辑:对不起,你写的东西应该读得更好一点。如果您想要这样的 动态 字段,那么您需要执行以下操作,它会完全按照您的意愿进行操作:

class SitesForm(forms.ModelForm):
  class Meta:
    model = Sites

  def __init__(self, *args, **kwargs):
    self.base_fields['mynewfield'] = forms.CharField(max_length=255, blank=True)
    super(SitesForm, self).__init__(*args, **kwargs)

class SitesAdmin(admin.ModelAdmin):
  form = SitesForm

admin.site.register(Sites, SitesAdmin)

base_fields 由包含表单将使用的字段的元类组成。

【讨论】:

  • 我知道,但我需要使用 init
  • 这应该是你现在想要的!
【解决方案2】:

解决方案:

class AdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(AdminForm, self).__init__(*args, **kwargs)
        self.fields.insert(1, 'myfield', forms.CharField())

class MyAdmin(admin.ModelAdmin):
    form = AdminForm

    def get_fieldsets(self, request, obj=None):
        return (
            (None, {
                'fields': (..., 'myfield',),
            }),
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 2011-05-16
    • 1970-01-01
    • 2018-06-03
    • 2011-07-11
    • 2012-05-29
    • 2021-12-18
    • 2011-09-08
    相关资源
    最近更新 更多