Django Admin-预填充字段并设置为只读
我想在创建或更新对象时自动在模型中设置一个字段current user,并使其为只读,以便用户无法更改它: 要预填充字段,请执行以下操作: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
@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为用户提供选择字段不是您应该做的。如果他们别无选择,不要给他们选择的错觉。不要在表单中显示该字段,或者将用户传递给表单&如果确实要显示该字段,请使用一个只有一个选项的选择框。