Django admin中“%uuuu init”中的动态表单字段
我希望能够在运行时向django管理表单添加字段。我的模型和表格: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(
#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