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

时间:2011-07-22 09:39:18

标签: django django-models django-admin field

我的模特和表格:

#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)

字段'newfield'未以表格形式显示。为什么呢?

2 个答案:

答案 0 :(得分: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)

编辑:抱歉,应该已经阅读了你写得更好的内容了。如果您想要这样的动态字段,那么您需要执行以下操作,它将完全符合您的要求:

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 :(得分: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',),
            }),
        )