Well, I got it. In a very UGLY way, but it does its job.
I modified the inline class so that it gets access to the request object by overriding the get_formset function
class CheckupInLineAdmin(admin.StackedInline):
model = Checkup
form =CheckupAdminForm extra = 1
def get_formset(self, request, obj=None, **kwargs):
self.form.request=request
return super(CheckupInLineAdmin, self).get_formset(request, obj, **kwargs)Then I defined a form for this class overriding the __init__ function to give proper initial values:
class CheckupAdminForm(forms.ModelForm):
class Meta:
model = Checkup
def __init__(self, *args, **kwargs):
super(CheckupAdminForm, self).__init__(*args, **kwargs)
# if it is not an instance (an already saved object)
if not kwargs.has_key('instance'):
# get patient id from request path
# UGLY but I did not find a better way...
# the request path is something like
# /admin/myapp/patient/1/
# where 1 is the patient id
splitted = self.request.META['PATH_INFO'].split('/')
# check the last bit is a int
# this is useful when creating a new patient. In this case
# the request path is
# /admin/myapp/patient/add/ and the last bit is not the patient id
try:
id_pat = int(splitted[len(splitted)-2])
pat = Patient.objects.get(id=id_pat)
checkups = pat.checkups.all()
how_many = len(checkups)
# take the last checkup
if how_many > 0:
checkup = checkups[how_many - 1]
# initialize fields depending on the last chechup values
self.initial['alcol'] = checkup.alcol
except:
pass
If someone knows a better way, any hint is appreciated.
Cheers
FraMazz