Django - 根据请求覆盖get_form以自定义管理表单 [英] Django - Overriding get_form to customize admin forms based on request
问题描述
我已经尝试了各种方法来实现这一点。
我决定不要覆盖formfield_for_dbfield,因为它没有获取请求对象的副本,我希望
我已经在我的ModelAdmin类中覆盖了get_form,并尝试了以下操作:
class PageOptions(admin.ModelAdmin):
pre>
def get_form(self,request,obj = None,** kwargs):
if request.user.is_superuser:
self.fieldsets =((None,{'fields':('title','name',),}),)
else:
self.fieldsets =((None,{'fields ':('title',),}),)
return super(PageOptions,self).get_form(request,obj = None,** kwargs)
当我从get_form中打印fieldsets或declared_fieldsets时,我会得到None(或者我在页面选项中设置的初始值)。
为什么这不工作,有没有更好的方法来实现?
解决方案我不知道为什么打印属性不会让你想要你刚刚分配(我猜这可能取决于你打印的位置,确切地),但是尝试覆盖
get_fieldsets
。基本实现如下所示:
def get_fieldsets(self,request,obj = None):
如果self.declared_fieldsets:
return self.declared_fieldsets
form = self.get_formset(request).form
return [(None,{'fields':form.base_fields.keys ()})]
你应该能够返回你的元组。
由andybak编辑。 4年后,当我尝试在另一个项目上做类似的事情时,我再次发现自己的问题。这次我用这种方法,虽然修改稍微,以避免重复fieldets定义:
def get_fieldsets(self,request,obj = None):
#在添加表单上添加'item_type',并在changeforms上删除它。
fieldsets = super(ItemAdmin,self).get_fieldsets(request,obj)
如果不是obj:#这是一个添加表单
如果'item_type'不在fieldsets [0] [1] ['fields']:
fieldsets [0] [1] ['fields'] + =('item_type')
else:#这是一个更改形式
fieldsets [0] [1] ['fields'] = tuple(x for fieldsets [0] [1] ['fields'] if x!='item_type')
return fieldsets
I've tried various methods to achieve this.
I decided against overriding formfield_for_dbfield as it's doesn't get a copy of the request object and I was hoping to avoid the thread_locals hack.
I settled on overriding get_form in my ModelAdmin class and tried the following:
class PageOptions(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): if request.user.is_superuser: self.fieldsets = ((None, {'fields': ('title','name',),}),) else: self.fieldsets = ((None, {'fields': ('title',),}),) return super(PageOptions,self).get_form(request, obj=None, **kwargs)
When I print fieldsets or declared_fieldsets from within get_form I get None (or whatever I set as an initial value in PageOptions).
Why doesn't this work and is there a better way to do this?
解决方案I have no idea why printing the property doesn't give you want you just assigned (I guess may be that depends on where you print, exactly), but try overriding
get_fieldsets
instead. The base implementation looks like this:def get_fieldsets(self, request, obj=None): if self.declared_fieldsets: return self.declared_fieldsets form = self.get_formset(request).form return [(None, {'fields': form.base_fields.keys()})]
I.e. you should be able to just return your tuples.
EDIT by andybak. 4 years on and I found my own question again when trying to do something similar on another project. This time I went with this approach although modified slightly to avoid having to repeat fieldsets definition:
def get_fieldsets(self, request, obj=None): # Add 'item_type' on add forms and remove it on changeforms. fieldsets = super(ItemAdmin, self).get_fieldsets(request, obj) if not obj: # this is an add form if 'item_type' not in fieldsets[0][1]['fields']: fieldsets[0][1]['fields'] += ('item_type',) else: # this is a change form fieldsets[0][1]['fields'] = tuple(x for x in fieldsets[0][1]['fields'] if x!='item_type') return fieldsets
这篇关于Django - 根据请求覆盖get_form以自定义管理表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!