如果有办法检测是否正在添加或更改模型中的信息.
如果可以,则可以使用此信息排除字段.
一些伪代码来说明我在说什么.
class SubSectionAdmin(admin.ModelAdmin):
if something.change_or_add = 'change':
exclude = ('field',)
...
Run Code Online (Sandbox Code Playgroud)
谢谢
Ste*_*ike 15
orwellian的答案将使整个SubSectionAdmin单例改变其排除属性.
确保在每个请求的基础上排除字段的方法是执行以下操作:
class SubSectionAdmin(admin.ModelAdmin):
# ...
def get_form(self, request, obj=None, **kwargs):
"""Override the get_form and extend the 'exclude' keyword arg"""
if obj:
kwargs.update({
'exclude': getattr(kwargs, 'exclude', tuple()) + ('field',),
})
return super(SubSectionAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)
这将通知表单排除那些额外的字段.
在给定的字段被排除的情况下,不确定这将如何表现...
class SubSectionAdmin(admin.ModelAdmin):
# ...
def change_view(self, request, object_id, extra_context=None):
self.exclude = ('field', )
return super(SubSectionAdmin, self).change_view(request, object_id, extra_context)
Run Code Online (Sandbox Code Playgroud)
设置self.exclude为@ steve-pike提及,使整个SubSectionAdmin单例改变其排除属性.单例是一个类,它将在每次实例化类时重用相同的实例,因此实例仅在第一次使用构造函数时创建,并且后续使用构造函数将返回相同的实例.有关更详细的描述,请参阅Wiki页面.这意味着如果您编写代码以在更改时排除字段,则意味着如果您首先添加项目,该字段将在那里,但如果您打开要更改的项目,则该字段将被排除在您的后续访问中到添加页面.
实现每个请求行为的最简单方法是使用get_fields和测试obj参数,即None如果我们要添加对象,则在我们更改对象时使用对象的实例.该get_fields方法可从Django 1.7获得.
class SubSectionAdmin(admin.ModelAdmin):
def get_fields(self, request, obj=None):
fields = super(SubSectionAdmin, self).get_fields(request, obj)
if obj: # obj will be None on the add page, and something on change pages
fields.remove('field')
return fields
Run Code Online (Sandbox Code Playgroud)
更新:
请注意,get_fields可能会返回元组,因此您可能需要转换fields为列表以删除元素.如果您尝试删除的字段名称不在列表中,则可能还会遇到错误.因此,在某些情况下,如果您有其他排除字段的因素,最好使用列表推导构建一组排除和删除:
class SubSectionAdmin(admin.ModelAdmin):
def get_fields(self, request, obj=None):
fields = list(super(SubSectionAdmin, self).get_fields(request, obj))
exclude_set = set()
if obj: # obj will be None on the add page, and something on change pages
exclude_set.add('field')
return [f for f in fields if f not in exclude_set]
Run Code Online (Sandbox Code Playgroud)
或者,您也可以deepcopy在get_fieldsets方法中创建结果,在其他用例中,您可以访问更好的上下文以排除内容.最明显的是,如果您需要对字段集名称进行操作,这将非常有用.此外,如果您实际使用字段集,这是唯一的方法,因为这将省略调用get_fields.
from copy import deepcopy
class SubSectionAdmin(admin.ModelAdmin):
def get_fieldsets(self, request, obj=None):
"""Custom override to exclude fields"""
fieldsets = deepcopy(super(SubSectionAdmin, self).get_fieldsets(request, obj))
# Append excludes here instead of using self.exclude.
# When fieldsets are defined for the user admin, so self.exclude is ignored.
exclude = ()
if not request.user.is_superuser:
exclude += ('accepted_error_margin_alert', 'accepted_error_margin_warning')
# Iterate fieldsets
for fieldset in fieldsets:
fieldset_fields = fieldset[1]['fields']
# Remove excluded fields from the fieldset
for exclude_field in exclude:
if exclude_field in fieldset_fields:
fieldset_fields = tuple(field for field in fieldset_fields if field != exclude_field) # Filter
fieldset[1]['fields'] = fieldset_fields # Store new tuple
return fieldsets
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13247 次 |
| 最近记录: |