【问题标题】:Django: Read only fieldDjango:只读字段
【发布时间】:2010-04-14 17:40:42
【问题描述】:

如何允许用户在创建对象(“添加”页面)时填充字段,然后在“更改”页面访问时将其设为只读?

【问题讨论】:

    标签: django django-admin customization


    【解决方案1】:

    我找到的最简单的解决方案是覆盖 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 上测试的

    【讨论】:

    • 哇,我正要编辑模型模板,谢谢,效果很好:)
    • 像魅力一样工作。感谢您的提示。 +1
    【解决方案2】:

    您的问题有两点要解决。

    1。只读表单字段

    在 Django 中不存在,但您可以自己实现它,this blog post 可以提供帮助。

    2。添加/更改的不同形式

    我猜您正在寻找管理站点上下文中的解决方案(否则,只需在您的视图中使用 2 种不同的表单)。

    您最终可以在 ModelAdmin 中覆盖 add_viewchange_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在管理站点的更改页面上将是只读的,但在创建表单上是可编辑的。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      您可以编辑该模型的保存方法来处理此类要求。例如,您可以检查字段是否已包含某个值,如果包含,则忽略新值。

      【讨论】:

        【解决方案4】:

        一种选择是override or replace该特定模型的change_form模板。

        【讨论】:

        • 请注意,仅更改模板是安全的。用户仍然可以在伪造的 POST 中提交该字段,该字段将在服务器端被接受。
        猜你喜欢
        • 2017-08-29
        • 2012-07-04
        • 2011-02-25
        • 2017-05-07
        • 2012-11-28
        • 2021-03-06
        • 1970-01-01
        • 2016-05-01
        • 2018-05-03
        相关资源
        最近更新 更多