Python Django 1.7,动态管理表单

Python Django 1.7,动态管理表单,python,django,django-forms,django-admin,Python,Django,Django Forms,Django Admin,我试图在django admin中创建完全动态的表单。在goole-like和中找到解决方案。但这个解决方案对我不起作用。例如,此代码: class DeviceAdmin(admin.ModelAdmin): form = MyDeviceAdminForm def get_fieldsets(self, request, obj=None): fieldsets = super(DeviceAdmin, self).get_fieldsets(request,

我试图在django admin中创建完全动态的表单。在goole-like和中找到解决方案。但这个解决方案对我不起作用。例如,此代码:

class DeviceAdmin(admin.ModelAdmin):
    form = MyDeviceAdminForm
    def get_fieldsets(self, request, obj=None):
        fieldsets = super(DeviceAdmin, self).get_fieldsets(request, obj)
        fieldsets[0][1]['fields'] += ('foo',)
        return fieldsets

class MyDeviceAdminForm(forms.ModelForm):
    class Meta:
        model = Device
    def __init__(self, *args, **kwargs):
        super(MyDeviceAdminForm, self).__init__(*args, **kwargs)
        self.fields['foo'] = forms.IntegerField(label="foo")
出现此错误:“为设备指定了未知字段(项类型)。请检查DeviceAdmin类的字段/字段集/排除属性。”


我找不到解决这个问题的办法。我知道我需要在其他地方定义foo字段,但不知道在哪里。

如果您要更改的只是用户可见的字段名(内部字段名无论如何都不可见),您可以使用类工厂:

def get_MyDeviceAdminForm(字段名称):
类MyDeviceAdminForm(forms.ModelForm):
my_new_field_internal=forms.CharField(label=field\u name)
类元:
模型=信息日志
返回MyDeviceAdminForm
类DeviceAdmin(admin.ModelAdmin):

form=get_MyDeviceAdminForm(“新字段的详细名称”)
Django>1.4引入了导致此中断的更改。基本上,在表单工厂之前调用get_字段集,然后工厂抱怨您在get_字段集中引入的额外字段。幸运的是,get_字段集被多次调用,这提供了颠覆流程的机会。我的解决方案是在请求通过表单机制时向其添加标记属性:

def get_fieldsets(self, request, obj=None):
    fieldsets = super(DeviceAdmin, self).get_fieldsets(request, obj)
    if hasattr(request, "_gfs_marker"):
        fieldsets[0][1]['fields'] += ('foo',)
    setattr(request, "_gfs_marker", 1)
    return fieldsets

您需要指定要使用的字段,或排除不想使用的字段:@rnevius谢谢!但我不能这样做,因为我不知道在ModelForm的Meta中显式设置它的文件名。这就是我的问题——我想根据另一个字段的初始值生成一些字段。我不能在ModelForm init方法中声明它们,因为ModelAdmin识别这些更改已经太晚了,最终的html页面将不在这些字段中。谢谢,但是这里您静态地定义了额外的字段,我需要动态地定义它们,它们的名称和初始值由基本字段定义。我发现django管理员不能这样做。所以我只写我自己的观点。多谢各位!我也遇到同样的情况,不幸的是我不明白你是如何设法解决的。请您进一步解释一下好吗?@mufasa,ModelAdmin现在调用
get\u fieldset()
两次,一次是在表单初始化之前。如果您有一个自定义表单,其
\uuu init\uuu()
定义了自定义字段,那么对
get\u fieldset()
的第一次调用将抛出此错误,因为就它而言,对自定义字段的任何引用都是无效的。此修复程序删除第一次调用的所有自定义字段引用,但在定义它们之后将它们添加到第二次调用。这有点像黑客,但遗憾的是,这似乎是Django admin中支持自定义表单字段的唯一方法。几年后,这就省去了我的麻烦。大人物