【问题标题】:Django Admin - Prepopulate field and set readonlyDjango Admin - 预填充字段并设置为只读
【发布时间】:2019-04-14 15:36:17
【问题描述】:

我想在创建或更新对象时自动在模型中设置一个字段(当前用户)并使其只读,因此用户无法更改它:

为了预先填充该字段:

@admin.register(Model)
class ModelAdmin(admin.ModelAdmin):
    list_display = ('field_1', 'user')

    def get_form(self, request, obj=None, **kwargs):
        form = super(ModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['user'].initial = request.user
        return form

这可行,但是当我想使该字段只读时使用:

readonly_fields=('user', )

应用程序因错误而崩溃:

KeyError at /admin/api/model/add/
'user'

谁能帮助我并解释我如何使用 django admin 来实现我的目标?

谢谢!

【问题讨论】:

    标签: django field admin readonly populate


    【解决方案1】:

    Admin 提供了一个名为save_model 的方法,您可以使用该方法在保存对象时将当前用户添加到对象中;

    @admin.register(Model)
    class ModelAdmin(admin.ModelAdmin):
    
        def save_model(self, request, obj, form, change):
            obj.user = request.user
            super().save_model(request, obj, form, change)
    

    【讨论】:

    • 是的,我已经知道了,这是我可以明确设置当前用户的地方,但是......用户仍然可以从表单的下拉列表中选择任何用户......我该如何禁用这个?
    • @Creativecrypter 为用户提供选择字段因此不是您应该做的。如果他们别无选择,不要给他们选择的错觉。如果您真的想显示该字段,请不要在表单中显示该字段或将用户传递给该表单并有一个只有一个选择的选择框。
    【解决方案2】:

    我发现的一个解决方法是:

    form.base_fields['user'].disabled = True
    

    您还可以通过以下方式添加帮助文本:

    form.base_fields['user'].help_text = "some help text"
    

    所以在你的代码中应该是:

        def get_form(self, request, obj=None, **kwargs):
            form = super(ModelAdmin, self).get_form(request, obj, **kwargs)
            form.base_fields['user'].initial = request.user
            form.base_fields['user'].disabled = True
            form.base_fields['user'].help_text = "This field is not editable"
            return form
    

    那你就不用readonly_fields

    【讨论】:

      【解决方案3】:

      尝试覆盖 ModelAdmin 上的 get_readonly_fields() 方法

      def get_readonly_fields(self, request, obj=None):
          try:
              return 'user',
          except AttributeError:
              return super().get_readonly_fields(request, obj)
      

      【讨论】:

        猜你喜欢
        • 2013-01-11
        • 2018-06-12
        • 2019-03-14
        • 1970-01-01
        • 2019-03-19
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多