【发布时间】:2010-04-14 17:40:42
【问题描述】:
如何允许用户在创建对象(“添加”页面)时填充字段,然后在“更改”页面访问时将其设为只读?
【问题讨论】:
标签: django django-admin customization
如何允许用户在创建对象(“添加”页面)时填充字段,然后在“更改”页面访问时将其设为只读?
【问题讨论】:
标签: django django-admin customization
我找到的最简单的解决方案是覆盖 ModelAdmin 的 get_readonly_fields 函数:
class TestAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
'''
Override to make certain fields readonly if this is a change request
'''
if obj is not None:
return self.readonly_fields + ('title',)
return self.readonly_fields
admin.site.register(TestModel, TestAdmin)
添加页面的对象将是无,而更改页面的模型实例。 编辑:请注意这是在 Django==1.2 上测试的
【讨论】:
您的问题有两点要解决。
在 Django 中不存在,但您可以自己实现它,this blog post 可以提供帮助。
我猜您正在寻找管理站点上下文中的解决方案(否则,只需在您的视图中使用 2 种不同的表单)。
您最终可以在 ModelAdmin 中覆盖 add_view 或 change_view 并在其中一个视图中使用不同的形式,但恐怕您最终会遇到大量重复代码。
我能想到的另一个解决方案是,当传递instance 参数(即:edit 案例)时,将在实例化时修改其字段的表单。假设你有一个 ReadOnlyField 类,这会给你类似的东西:
class MyModelAdminForm(forms.ModelForm):
class Meta:
model = Stuff
def __init__(self, *args, **kwargs):
super(MyModelAdminForm, self).__init__(*args, **kwargs)
if kwargs.get('instance') is not None:
self.fields['title'] = ReadOnlyField()
在这里,模型Stuff中的字段title在管理站点的更改页面上将是只读的,但在创建表单上是可编辑的。
希望对您有所帮助。
【讨论】:
您可以编辑该模型的保存方法来处理此类要求。例如,您可以检查字段是否已包含某个值,如果包含,则忽略新值。
【讨论】:
一种选择是override or replace该特定模型的change_form模板。
【讨论】: