Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在ModelAdmin中动态操作Django中的表单字段?_Python_Django_Forms_Modeladmin - Fatal编程技术网

Python 如何在ModelAdmin中动态操作Django中的表单字段?

Python 如何在ModelAdmin中动态操作Django中的表单字段?,python,django,forms,modeladmin,Python,Django,Forms,Modeladmin,我在模型中有一个字段(slug),它是“必需的”,但我想将ModelAdmin类中的字段更改为可选的。如果用户未填写,则会由另一个字段(名称)自动填写 我尝试了各种方法,例如在ModelAdmin中重写get_form(),或者使用ModelForm类并专门指定表单 class SomeModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): form = super(se

我在模型中有一个字段(slug),它是“必需的”,但我想将ModelAdmin类中的字段更改为可选的。如果用户未填写,则会由另一个字段(名称)自动填写

我尝试了各种方法,例如在ModelAdmin中重写get_form(),或者使用ModelForm类并专门指定表单

class SomeModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(self.__class__, self).get_form(request, obj, **kwargs)
        form.slug.required = False
        return form
然而,这两种解决方案对我都不起作用。除了手动创建表单,还有其他更快的解决方案吗


我有很多这样的表单,手工操作可能会很乏味,也很难维护。

在您的
get\u form
方法中,
form.fields['slug')。必需的
应该可以

但是正确的方法是简单地提供一个定制的ModelForm

class SomeModelForm(forms.ModelForm):
    slug = forms.CharField(required=False)

class SomeModelAdmin(admin.ModelAdmin):
    form = SomeModelForm
顺便说一句,请不要做
super(self.\uuuu class\uuuuu,self)
。在使用
super
时,您应该始终显式地命名当前类,否则继承自您的类并依次调用
super
的任何子类都将中断

编辑
表单.字段
,而不是
表单.字段


通过说
self.\uuuuu class\uuuuu
,您明确地阻止了Python计算继承-因为它总是引用具体的类-即继承树的底部。但是如果您的方法位于树的中间,那么在
super
中引用具体类是错误的——因为您希望它从您所在的位置调用下一个级别,而不是从底部调用上一个级别。这就是为什么你应该总是把你所在的类命名为super(SomeModelAdmin,self)

我只是想报告一下,以防其他人发现这很有用

我从来都无法在
get_form
method do
form.fields['slug']中执行。必填项
,也从未找出原因。但是,我通过创建一个继承自ModelForm的新表单解决了我的问题

class SomeModelForm(forms.ModelForm):
    slug = forms.CharField(required=False)

class SomeModelAdmin(admin.ModelAdmin):
    form = SomeModelForm
调用父构造函数后,我必须重写init()来设置
self.fields['slug'].required=False
,然后重写
clean_slug()
,如果需要,通过访问
self.data['slug']
来修改slug字段内容


希望这能帮助一些人

在我自己解决同样的问题时通过谷歌找到这个页面。以下内容也适用于
ModelAdmin

def get_form(self, *args, **kwargs):
    form = super(SomeModelAdmin, self).get_form(*args, **kwargs)
    form.base_fields['slug'].required = False
    return form
从更新的
ModelFormMetaclass
创建的后续表单将不需要
slug
字段


这在我的情况下效果更好,因为我只有一个类,在其中我需要取消对字段的请求,并且不需要在save上进行任何数据转换。如果你有很多类,或者需要进行数据转换,GoogleDroid的解决方案会更好。

我得到了一个
AttributeError
使用
forms.fields['slug']将字段表示为无效属性。必填项
。提供定制的表单是我试图避免的事情,因为涉及的工作量很大,因为我有很多模型。另外,我也不完全确定为什么
super(self.\uuuuu class\uuuuuuu,self)
如果是子类的话会崩溃?Python不应该根据作用域来计算吗?谢谢你调查此事。再次感谢!这是我的错别字,但在我的代码中是正确的,但仍然不起作用。我发现从
get\u form
返回的表单类型是
django.forms.models.ModelFormMetaclass
<代码>目录(表单)
也没有显示字段属性。