Python 如何在ModelAdmin中动态操作Django中的表单字段?
我在模型中有一个字段(slug),它是“必需的”,但我想将ModelAdmin类中的字段更改为可选的。如果用户未填写,则会由另一个字段(名称)自动填写 我尝试了各种方法,例如在ModelAdmin中重写get_form(),或者使用ModelForm类并专门指定表单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
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 doform.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
<代码>目录(表单)
也没有显示字段属性。