目标:创建和更新资源时,在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建议保存,我打算这样做,但在此之前我需要它显示在表单上。
答案 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)
希望有帮助。