Django admin中“%uuuu init”中的动态表单字段

Django admin中“%uuuu init”中的动态表单字段,django,django-models,django-admin,field,Django,Django Models,Django Admin,Field,我希望能够在运行时向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(

我希望能够在运行时向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
未显示在表单中。为什么?

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

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)
基本字段由元类组成,元类保存表单将使用的字段。

解决方案:

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

我知道,但我需要使用init,它现在可以做你想做的事情了!我需要使用uuuuuuu init_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu