Django - 根据请求覆盖get_form以自定义管理表单 [英] Django - Overriding get_form to customize admin forms based on request

查看:130
本文介绍了Django - 根据请求覆盖get_form以自定义管理表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经尝试了各种方法来实现这一点。



我决定不要覆盖formfield_for_dbfield,因为它没有获取请求对象的副本,我希望



我已经在我的ModelAdmin类中覆盖了get_form,并尝试了以下操作:

  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)
pre>

当我从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屋!

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