Django admin中的__init__中的动态表单字段 [英] Dynamic Form fields in `__init__` in Django admin

查看:86
本文介绍了Django admin中的__init__中的动态表单字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望能够在运行时将字段添加到django管理表单中。我的模型和表格:

I want to be able to add fields to django admin form at runtime. My model and form:

#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 不显示通知。为什么?

Field mynewfield isn't displayed in form. Why?

推荐答案

您不应该以这种方式向表单添加新字段,您可以按照自己的方式进行操作其他任何字段和表单都将同时包含模型的原始字段和新字段:

You shouldn't be adding a new field to your form in that way, you can just do it as you would any other field and the form will contain both the Model's original fields and your new fields:

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: Sorry, should have read what you had written a little better. If you want a dynamic field like that, then you need to do the following and it will do exactly what you want:

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

It's the base_fields that gets composed by the metaclass that holds the fields that the form will use.

这篇关于Django admin中的__init__中的动态表单字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆