Django管理员__init__中的动态表单字段

问题描述 投票:4回答:2

我希望能够在运行时将字段添加到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未以表格形式显示。为什么?

django django-models django-admin field
2个回答
2
投票

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

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)

Edit:对不起,应该已经读了一些更好的文章。如果您想要这样的[[dynamic字段,则需要执行以下操作,它将完全执行您想要的操作:

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,它包含表单将使用的字段。

1
投票
解决方案:

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',), }), )

© www.soinside.com 2019 - 2024. All rights reserved.