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

时间:2018-10-09 23:56:45

标签: python django

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

此显示应为只读字段( readonly ,未禁用)。显示的user_id是从发出请求的用户(request.user)派生的,因此可以从中设置初始值。

this post之后,我们应该像这样在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

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

Other posts建议保存,我打算这样做,但在此之前我需要它显示在表单上。

1 个答案:

答案 0 :(得分:4)

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

  

此选项中的任何字段(应为列表或元组)将按原样显示其数据,并且不可编辑;它们也从用于创建和编辑的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)

希望有帮助。