当前位置: 首页 > 面试题库 >

Django-覆盖get_form以根据请求自定义管理表单

诸葛雨泽
2023-03-14
问题内容

我尝试了各种方法来实现这一目标。

我决定不重写formfield_for_dbfield,因为它没有获得请求对象的副本,并且我希望避免对thread_locals的攻击。

我决定在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)

当我从get_form中打印字段集或声明的字段集时,我将获得None(或在PageOptions中设置为初始值的任何值)。

为什么这不起作用,还有更好的方法吗?


问题答案:

我不知道为什么打印该属性不会给你想要分配的权限(我想可能完全取决于你打印的位置),但是尝试覆盖get_fieldsets。基本实现如下所示:

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()})]

也就是说,你应该能够只返回你的元组。

由andybak编辑。4年后,当我尝试在另一个项目中做类似的事情时,我再次遇到了自己的问题。这次我采用了这种方法,尽管略作修改以避免重复字段集定义:

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管理员中,我想覆盖并实现自己的模型形式(例如发票模型)。 我希望发票表单具有用于客户名称,产品名称的自动填写字段,并且我还想进行自定义验证(例如客户的信用额度)。如何覆盖Django管理员提供的默认格式并实现自己的默认格式? 问题答案: 如何根据docs在django admin中覆盖表单:

  • 问题内容: 我有一个自定义TagField表单字段。 如上所示,它使用TextInput表单字段小部件。但是在管理员中,我希望使用Textarea小部件来显示它。为此,存在钩子,但在这种情况下不起作用。 管理员声明为: 这对表单字段窗口小部件没有影响,并且仍使用TextInput小部件呈现。 问题答案: django管理员对其许多字段使用自定义窗口小部件。覆盖字段的方法是创建一个供ModelAdm

  • 问题内容: 我想要的只是让bool(myInstance)返回False(以及在if / or / and等条件下让myInstance评估为False。我知道如何覆盖>,<,=) 我已经试过了: 有什么建议? (我正在使用Python 2.6) 问题答案: 这是Python 2.x还是Python 3.x?对于Python 2.x,您正在寻找替代方法。

  • 在苹果自带地图和百度地图上覆盖一层图片,图片可以随地图缩放移动。关键就是自定义Overlay和OverlayView。 作者说:实在无力吐槽了,百度地图iOS SDK中的静态库文件居然都是10M !由于过大上传不了,亲们自行去 http://developer.baidu.com/map/sdk-ios.htm 按提示添加SDK吧!至于基于百度地图的自定义Overlay和OverlayView 记

  • 首先,我是Spring集成和Spring JMS方面的新手,所以我尝试采用的解决方案可能不适合我的需求。 我将尝试解释我需要实现什么:基本上,我需要将消息放在一个队列中,并在另一个队列中异步等待答案。 1、将消息放入队列: 我的解决方案: -- 2.异步监听来自另一个队列的回复消息: 我的解决方案1: 自定义MessageListener实现javax.jms.MessageListener。 然

  • 问题内容: 我的一个模型具有一个delete标志,该标志用于全局隐藏对象: 如何覆盖Django管理模块使用的默认查询集以包括已删除的对话? 问题答案: 你可以在模型管理类中重写 方法。 请注意,在Django <= 1.5中,该方法被命名为just 。