Django Admin-预填充字段并设置为只读

Django Admin-预填充字段并设置为只读,django,field,admin,readonly,populate,Django,Field,Admin,Readonly,Populate,我想在创建或更新对象时自动在模型中设置一个字段current user,并使其为只读,以便用户无法更改它: 要预填充字段,请执行以下操作: @admin.register(Model) class ModelAdmin(admin.ModelAdmin): list_display = ('field_1', 'user') def get_form(self, request, obj=None, **kwargs): form = super(ModelAd

我想在创建或更新对象时自动在模型中设置一个字段current user,并使其为只读,以便用户无法更改它:

要预填充字段,请执行以下操作:

@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实现我的目标吗


谢谢

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)

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)

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

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

那么你就不必使用只读字段了,我找到的解决办法是:

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\u字段

尝试覆盖ModelAdmin上的get\u readonly\u fields方法

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

尝试覆盖ModelAdmin上的get\u readonly\u fields方法

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

是的,我已经知道了,这是我可以确定设置当前用户的地方,但是。。。用户仍然可以从表单中的下拉列表中选择任何用户…如何禁用此功能?@Creativecrypter为用户提供选择字段不是您应该做的。如果他们别无选择,不要给他们选择的错觉。要么不在表单中显示字段,要么将用户传递给表单&如果您真的想显示字段,请使用一个只有一个选项的选择框。是的,我已经知道了,这是我可以确定设置当前用户的地方,但是。。。用户仍然可以从表单中的下拉列表中选择任何用户…如何禁用此功能?@Creativecrypter为用户提供选择字段不是您应该做的。如果他们别无选择,不要给他们选择的错觉。不要在表单中显示该字段,或者将用户传递给表单&如果确实要显示该字段,请使用一个只有一个选项的选择框。