Django Admin表单:设置只读字段的默认值

jbo*_*ily 2 python django

目标:创建和更新资源时,在django管理表单上显示特定user_id请求的只读信息。

此显示应该是一个只读字段(readonly,未禁用)。的user_id显示被从请求用户派生(request.user),以使初始值被从设置。

这篇文章之后,我们应该get_form像这样简单地在方法中进行设置:

def get_form(self, request, obj=None, *args, **kwargs):
    form = super(ProfileAdmin, self).get_form(request, *args, **kwargs)
    form.base_fields['user'].initial = request.user
    return form
Run Code Online (Sandbox Code Playgroud)

但是,用户不再处于base_fields只读状态。实际上,我在任何地方都找不到它。有什么想法吗?

其他帖子建议保存,我打算这样做,但在此之前我需要将其显示在表单上。

not*_*der 5

正确的是,将字段设置为只读会将其从base_fields中排除。如文档所述

此选项中的任何字段(应为列表或元组)将按原样显示其数据,并且不可编辑;它们也从用于创建和编辑的ModelForm中排除。

您可以像list_display一样为它定义一个方法,但是由于需要从请求中设置用户,因此我们需要有request对象,该对象在该方法中不可用。

因此,对于您的用例,我们可以使用formfield_for_foreignkey方法:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if db_field.name == 'lend_by':
        # setting the user from the request object
        kwargs['initial'] = request.user.id
        # making the field readonly
        kwargs['disabled'] = True
    return super().formfield_for_foreignkey(db_field, request, **kwargs)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。

  • 创建新记录时这不起作用,因为提交表单时“disabled”属性会使字段的值被忽略。 (2认同)